先日から、無線でサーボモーターを動かす実験をしています。

 

 

 

 

今回はwifiではなく、Bluetoothで動かしてみました。

使用したのはESP32とサーボモーター(SG90)。

配線図や動いている様子などは前回と同じなので割愛します。

 

 

今回のポイントは、Bluetooth接続の確認COMポートの確認です。

おおまかな流れとしては下記のようになります。

  1. まずはESP32のプログラムを書き込み
  2. PCからBluetoothのデバイスとしてペアリング
  3. ペアリングができたら、COMポートを確認
  4. そのCOMポート番号をPythonのプログラムに反映させて動かす
 
ESP32のプログラムは下記のようにしました。
BluetoothSerialESP32Servoのライブラリを使用しています。
 

#include <BluetoothSerial.h>

#include <ESP32Servo.h>

 

BluetoothSerial SerialBT;

Servo servo1;

 

void setup()

{

    Serial.begin(115200);

 

    //Bluetoothの名前

    SerialBT.begin("ESP32_SERVO");

 

    Serial.println("Bluetooth Start");

    Serial.println("ESP32_SERVO");

 

    //GPIO18へ接続

    servo1.attach(18);

 

    //初期角度

    servo1.write(90);

}

 

void loop()

{

    if(SerialBT.available())

    {

        String data =

        SerialBT.readStringUntil('\n');

 

        data.trim();
 

        Serial.print("Receive : ");

        Serial.println(data);

 

        //ANGLE:90を判定

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

        {

            int angle =

            data.substring(6).toInt();
 

            //0~180°へ制限

            if(angle < 0)

            {

                angle = 0;

            }

            if(angle > 180)

            {

                angle = 180;

            }
 

            servo1.write(angle);
 

            Serial.print("Servo Angle : ");

            Serial.println(angle);

 

            //Python側へ返信

            SerialBT.println("OK");

        }

        else

        {

            SerialBT.println("ERROR");

        }

    }

}

 
 
ペアリングの時に出てくる名前は、ESP32で設定した名前です。
今回はESP32_SERVOとしましたので、そのデバイスを追加します。
 
 
 
次に、このデバイスのCOMポートを確認します。
ちょっと深い階層にあるのですが、「(Windowsの)設定」⇒「Bluetoothデバイス」⇒「その他のBluetooth設定」⇒「COMポート」で確認できます。
下記のような画面が出てくると思うので、今回はPCから発信をしたいのでCOM13を覚えておきます。
 
 
 
デバイスマネージャーからもCOMポートは確認できますが、どのデバイスがどのCOMポートなのか分からないので、何度か試しても良いならそちらで確認してもOKです。
 
こんな感じで、Bluetoothで使っているCOMポートは分かります。
今回の場合だと、4回試せばどれかは当たります。
実は私もこちらの方法でやりましたが、Pythonのプログラムを1か所変更するだけなので、全然手間では無かったです。
 
 
最後に、Pythonプログラムを動かします。
プログラムの内容は下記のようにしました。
 

import tkinter as tk

import serial

import time
 

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

# BluetoothのCOMポートを設定

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

 

COM_PORT = "COM13"   //環境に応じて変更

 

BAUDRATE = 115200
 

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

# Bluetooth接続

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

 

try:

    ser = serial.Serial(

            COM_PORT,

            BAUDRATE,

            timeout=1

          )

 

    time.sleep(2)

 

    print("Bluetooth Connected")

 

except Exception as e:

 

    print(e)
 

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

# サーボ角度送信

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

 

def send_angle():

 

    try:

        angle = int(

            entry.get()

        )

 

        if angle < 0:

            angle = 0
 

        if angle > 180:

            angle = 180

 

        command = \

        f"ANGLE:{angle}\n"

 

        #ESP32へ送信

        ser.write(

            command.encode()

        )

 

        #返信を受信

        response = \

        ser.readline().decode().strip()

 

        print(response)

 

        value_label.config(

            text=

            f"送信値:{angle}°"

        )
 

    except Exception as e:

 

        print(e)


 

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

# スライダー

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

 

def slider_changed(value):

 

    angle = int(

            float(value)

            )
 

    entry.delete(

        0,

        tk.END

    )
 

    entry.insert(

        0,

        str(angle)

    )


 

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

# GUI設定

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

 

root = tk.Tk()

 

root.title(

    "Bluetooth 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()


 

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

 

button = tk.Button(

        root,

        text="送信",

        width=15,

        height=2,

        command=send_angle

)

 

button.pack(

        pady=10

)


 

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

 

value_label = tk.Label(

        root,

        text="送信値:90°"

)

 

value_label.pack()

 

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

 

root.mainloop()

 

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

# 終了時

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

 

ser.close()

 
 
これで無線で動かす方法は一通り試せました。
それぞれの特徴も何となく掴めましたので、良い勉強になりました!