前言
手头上有个ESP32,发现有wifi功能,希望连接JY61P并通过WIFI把姿态数据发送给电脑
1.采用Arduino IDE编译器;需要安装ESP32的开发板管理器;
2.电脑接受数据是基于python的;
1. ESP32 连接手机WIFI
#include <WiFi.h> // 引入 WiFi 库
// 替换为你的 Wi-Fi 网络名称和密码
const char* ssid = "wifi名称";
const char* password = "wifi密码";
void setup() {
Serial.begin(115200); // 初始化串口通信
delay(1000); // 等待 1 秒
// 连接到 Wi-Fi 网络
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
// 等待连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// 连接成功后打印 IP 地址
Serial.println("\nConnected to WiFi!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// 在这里可以添加更多功能
delay(1000);
}
可以用上面这段代码,测试WIFI功能,打开串口助手,我这里使用的是XCOM,如果成功,会显示如下数据,提醒:不要勾选16进制显示。
2.ESP32连接IMU(JY61P)
(1).硬件连接
ESP32 与 JY61P 的连接:
JY61P 的 VCC 连接到 ESP32 的 3.3V。
JY61P 的 GND 连接到 ESP32 的 GND。
JY61P 的 TX 连接到 ESP32 的 GPIO 16(Serial2 的 RX 引脚)。
JY61P 的 RX 连接到 ESP32 的 GPIO 17(Serial2 的 TX 引脚)。
#include <WiFi.h>
#include <WiFiClient.h>
// Wi-Fi 网络信息
const char* ssid = "wifi名称";
const char* password = "wifi密码"; // 替换为你的 Wi-Fi 密码
// TCP 服务器信息
const char* serverIP = "XXXXX"; // 替换为电脑的 IP 地址
const uint16_t port = 8080; // 电脑端的 TCP 服务器端口
// 初始化 TCP 客户端
WiFiClient client;
// JY61P 串口通信
#define JY61_BAUDRATE 9600 // JY61P 默认波特率
void setup() {
// 初始化串口
Serial.begin(115200); // 用于调试
Serial2.begin(JY61_BAUDRATE, SERIAL_8N1, 16, 17); // 使用 Serial2,连接到 GPIO 16 (RX) 和 GPIO 17 (TX)
// 连接到 Wi-Fi 网络
WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// 连接到电脑的 TCP 服务器
Serial.print("Connecting to server at ");
Serial.print(serverIP);
Serial.print(":");
Serial.println(port);
if (!client.connect(serverIP, port)) {
Serial.println("Connection failed");
while (1); // 如果连接失败,进入死循环
}
Serial.println("Connected to server");
}
void loop() {
// 检查 JY61P 是否有数据
if (Serial2.available() >= 10) { // JY61P 每次发送 10 字节数据
uint8_t data[10];
for (int i = 0; i < 10; i++) {
data[i] = Serial2.read(); // 读取数据
}
// 解析数据(以角度为例)
int16_t roll = (data[0] << 8) | data[1]; // 横滚角
int16_t pitch = (data[2] << 8) | data[3]; // 俯仰角
int16_t yaw = (data[4] << 8) | data[5]; // 航向角
// 将数据格式化为字符串
String message = "Roll: " + String(roll) +
", Pitch: " + String(pitch) +
", Yaw: " + String(yaw);
// 打印数据到串口监视器(调试用)
Serial.println(message);
// 将数据发送到电脑的 TCP 服务器
if (client.connected()) {
client.println(message);
} else {
Serial.println("Connection lost. Reconnecting...");
if (client.connect(serverIP, port)) {
Serial.println("Reconnected to server");
} else {
Serial.println("Reconnection failed");
}
}
}
}
上述代码中的IP地址可以百度自行查询自己的IP地址。
3.电脑端监听
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("0.0.0.0", 8080)) # 监听端口 8080
sock.listen(1)
print("Server started, waiting for connection...")
client, addr = sock.accept()
print(f"Connected by {addr}")
while True:
data = client.recv(1024)
if not data:
break
print("Received data:", data.decode())
如果运行正常:窗口会打印出如下数据