今回は、wifi環境がある場合において、PCからマイコンに繋がっているサーボモーターを動かす実験を行いました。
マイコンとサーボモーターの配線については、先日行ったwifi環境が無い場合に動かしたい場合と同じなので、こちらを参照してください。
wifi環境を使うことで、1台のPCから複数のESP32を操作することも可能になるので、拡張性が高くなります。
とりあえず今回は1台のみですが、しっかりと動くところまで確認できました。
動画は前回と同じ絵にしかならないので割愛します。
今回のポイントは、同じwifi環境でPCとESP32を接続することです。
少し躓いたポイントなどもありましたので、その点を強調しつつ記録を残していきます。
まず、自分のPCのIPアドレスを確認します。
ターミナルを開いて、「ipconfig」と打ち込みます。
下記のような結果が出てくればOKです。
ここで、PCのIPアドレスよりも、デフォルトゲートウェイに注目してください。
ESP32の設定をこれと同じにしなければPCと繋げることはできません。
AIにプログラムを書かせると、だいたい「192.168.0.1」になると思うので、異なる場合は修正が必要です。
ESP32のIPアドレスは、固定IPにしました。
他のデバイスと被らないような数字にする必要があります。
ESP32のプログラムはこちら。
#include <WiFi.h>
#include <ESP32Servo.h>
const char* ssid = "********"; //自分のwifi環境を入力
const char* password = "********"; //自分のwifi環境を入力
IPAddress local_IP(192,168,10,200); //自分の環境に合わせる
IPAddress gateway(192,168,10,1); //自分の環境に合わせる
IPAddress subnet(255,255,255,0); //自分の環境に合わせる
WiFiServer server(5000);
Servo servo;
void setup()
{
Serial.begin(115200);
servo.attach(18);
servo.write(90);
WiFi.config(
local_IP,
gateway,
subnet
);
WiFi.begin(
ssid,
password
);
while(WiFi.status()!=WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi OK");
Serial.println(
WiFi.localIP()
);
server.begin();
Serial.println("TCP Server Start");
}
void loop()
{
WiFiClient client = server.available();
if(client)
{
Serial.println("Client Connected");
while(client.available()==0)
{
delay(1);
}
String data =
client.readStringUntil('\n');
Serial.print("RX:");
Serial.println(data);
if(data.startsWith("ANGLE:"))
{
int angle =
data.substring(6).toInt();
Serial.print("Servo:");
Serial.println(angle);
servo.write(angle);
}
client.stop();
Serial.println("Client Close");
}
}
Pythonのプログラムはこちら。
import tkinter as tk
import socket
HOST = "192.168.10.200" //ESP32の設定に合わせる
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 Exception as e:
print(e)
#-----------------
def slider(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()
#-----------------
scale = tk.Scale(
root,
from_=0,
to=180,
orient="horizontal",
length=300,
command=slider
)
scale.set(90)
scale.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()
うまく繋がらない場合は、pingの確認を行いましょう。
下記のような画面であれば、OKです。
うまく繋がらない場合は、どこかで設定を間違えている可能性があります。
よく確認しましょう。
これがうまく出来れば、拡張性の高いシステムを作ることができますね。
何を作ろうかな~。






