先日から、無線でサーボモーターを動かす実験をしています。
今回はwifiではなく、Bluetoothで動かしてみました。
使用したのはESP32とサーボモーター(SG90)。
配線図や動いている様子などは前回と同じなので割愛します。
今回のポイントは、Bluetooth接続の確認とCOMポートの確認です。
おおまかな流れとしては下記のようになります。
- まずはESP32のプログラムを書き込み
- PCからBluetoothのデバイスとしてペアリング
- ペアリングができたら、COMポートを確認
- そのCOMポート番号をPythonのプログラムに反映させて動かす
#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");
}
}
}
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()







