1.首先编写esp32cam的arduino的ino文件,代码如下所示,注意arduino选esp32 wrove module

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <ESP32Servo.h>

// 舵机控制引脚
#define SERVO_PIN 13  

Servo myservo;

// BLE 相关 UUID
#define SERVICE_UUID        "12345678-1234-1234-1234-1234567890ab"
#define CHARACTERISTIC_UUID "abcdefab-1234-5678-1234-abcdefabcdef"

BLECharacteristic *pCharacteristic;

// BLE 特征回调:接收手机/PC写入的数据
class MyCallbacks: public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    String value = pCharacteristic->getValue();  // Arduino String
    if (value.length() > 0) {
      Serial.print("Received: ");
      Serial.println(value);

      // 将字符串转换为角度
      int angle = value.toInt();
      if (angle >= 0 && angle <= 180) {
        myservo.write(angle);  // 控制舵机
      } else {
        Serial.println("角度无效,只能 0~180");
      }
    }
  }
};

void setup() {
  Serial.begin(115200);
  Serial.println("ESP32 BLE Servo Control");

  // 初始化舵机
  myservo.attach(SERVO_PIN);
  myservo.write(90);  // 初始中位

  // 初始化 BLE
  BLEDevice::init("ESP32_Servo");
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // 创建特征
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_WRITE
                    );
  pCharacteristic->setCallbacks(new MyCallbacks());

  // 启动服务
  pService->start();

  // 开始广播
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(pService->getUUID());
  BLEDevice::startAdvertising();

  Serial.println("等待 BLE 客户端连接...");
}

void loop() {
  // 主循环不需要处理,舵机通过 BLE 写入控制
}

2.手机下载nRF Connect手机版或者PC版,这里使用python脚本连接esp32cam的蓝牙

首先得知道esp32cam的mac地址,所以写一段mac获取脚本

import asyncio
from bleak import BleakScanner

async def scan():
    devices = await BleakScanner.discover()
    for d in devices:
        print(d)

asyncio.run(scan())

接下来是连接脚本,设定旋转90度,mac填写上面搜到的mac,SERVICE_UUID和CHAR_UUID必须和arduino的ino文件里的相同

import asyncio
from bleak import BleakClient

ESP32_MAC = "AA:BB:CC:DD:EE:FF"
SERVICE_UUID = "12345678-1234-1234-1234-1234567890ab" 
CHAR_UUID = "abcdefab-1234-5678-1234-abcdefabcdef"

async def main():
    async with BleakClient(ESP32_MAC) as client:
        print("连接成功:", client.is_connected)

        # 发送角度 150°
        angle = 30
        await client.write_gatt_char(CHAR_UUID, str(angle).encode())
        print(f"已写入角度: {angle}")

        # 等 5 秒,再发送 0°


asyncio.run(main())

3.连线参考【入门级蓝牙wifi芯片:ESP32cam系列】ESP32cam+烧录座无需TTL如何实现5V供电(一)https://blog.csdn.net/2401_82756020/article/details/150979153?spm=1001.2014.3001.5501

注意SG90舵机黄线连接pin13,红线是电源,棕线是地线。

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐