这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » DIY电子测光表-任务5-进阶-蓝牙传输与舵机控制

共1条 1/1 1 跳转至

DIY电子测光表-任务5-进阶-蓝牙传输与舵机控制

菜鸟
2024-11-25 19:50:22     打赏

挑战进阶任务

1. 蓝牙将测光结果回传到手机显示;

2. 通过手机远程控制舵机按压快门按钮;

蓝牙 BLE

简单介绍

ESP32-S3 是一款双核XTensa LX7微控制器,运行频率为240MHz。除了其内部的512KB SRAM外,它还集成了集成的2.4GHz、802.11b/g/n Wi-Fi和蓝牙5(LE)连接性,提供长距离支持。它有45个可编程GPIO,并支持丰富的外围设备。ESP32-S3 支持更大的高速八通道SPI闪存以及具有可配置数据和指令缓存的PSRAM。


ESP32-S3 支持 2.4GHz Wi-Fi(802.11 b/g/n),带宽支持为 40MHz。蓝牙低功耗子系统通过编码物理层和广告扩展支持长距离传输。它还支持更高的传输速度和数据吞吐量,具有 2Mbps 物理层。Wi-Fi 和蓝牙 LE 的射频性能在高温下仍然保持优越。


即此块开发板仅支持蓝牙BLE,不支持经典蓝牙。


库介绍

基于NimBLE的arduino-esp32蓝牙低功耗(BLE)库。这是一个更新和更低的资源替代原来的bluedoid BLE库esp32。使用闪存空间,少大约100 kb ram少50%相同的功能。几乎100%兼容现有的应用程序代码,包括迁移指南。


为了使用蓝牙BLE,安装了 NimBLE-Arduino 库,并且顺利运行其中的示例。


考虑到进阶任务有两个需求:

1. 开发板通过蓝牙将测光结果回传到手机,即需要一个 notify 属性;

2. 手机可以远程控制舵机按压快门,需要一个 write 属性。

即BLE程序至少需要两个属性,很简单。

蓝牙上报测光结果

任务拆解

BLE 广播,手机连接,读取 notify 消息即传感器光强度数值。


任务实现

简单来说,把任务封装成两个函数

1. setup_ble_server_task()

2. loop_ble_server_task()



setup_ble_server_task


Pasted image 20241125184836-setup-ble.png


1. 进行 BLE 初始化,调用 BLEDevice::Init("EEPW-DIY3") 创建一个 BLE 设备并命名为 EEPW-DIY3 并且广播名字也为这个;

2. 创建一个 server

3. 为这个 server 注册了回调函数,回调函数 MyServerCallbacks 负责管理 onConnect, onDisconnect() 等事件;

4. 设置这个 server 的 UUID;

5. 创建一个权限为 NOTIFY 的 characteristic ,指定 UUID 为 CHARACTERISTIC_UUID_TX;

6. 创建一个权限为 WRITE 的 characteristic,制定 UUID 为 CHARACTERISTIC_UUID_RX,并且绑定它的回调事件为 MyCharCallbacks(),舵机的启动就在这个回调函数中;

7. 启动广播;


loop_ble_server_task()


Pasted image 20241125185235-loop-ble-task.png

这个函数非常简单:


1. 只有当有设备连接到BLE时,才会调用函数 build_upload_msg() 把光照强度封装成字符串,然后通过 NOTIFY 属性上报给手机;

2. 此函数管理设备连接状态,当设备断开连接时,又重新开启广播。


构造光照强度上报信息


Pasted image 20241125185452-build-lux-msg.png


此函数仅仅把光照强度封装在字符串中,为了方便仅仅用一个字符串来表示。如果后期需要上报更多消息,可以封装成 JSON 格式方便解析和管理。


舵机

模块介绍


Pasted image 20241125185635-servo-DF9GMS.png


DFRobot DF9GMS是一个360度微伺服系统。它使用了一个塑料齿轮驱动器,而且轻而紧凑。它可用于各种应用程序和DIY产品,如玩具车、船、风车等。360度伺服系统的操作更类似于直流电机,而不是标准的伺服系统,因为只有旋转方向和速度可以控制。轴的内部也没有硬件停止,所以轴可以自由旋转。与普通的直流电机相比,360度伺服电机不需要额外的电机驱动器,而且是即插即用的,紧凑和方便。Arduino的控制方法也是一样的。当伺服系统在4.8 ~ 6V电源上工作时,扭矩可达到1.2 ~ 1.6Kg x cm。


需要注意360度舵机不能精准地控制旋转角度,只能控制方向和速度:

1. 控制舵机的输入参数范围[0, 180]。

2. 其中90度表示停转;小于90度表示顺时针旋转,从0~90速度越来越慢;

3. 大于90度表示逆时针旋转,从90~180速度越来越慢;



库介绍

安装的库是 ESP32Servo 库。


允许ESP32开发板使用Arduino语义控制舵机、蜂鸣器和模拟写入电机。该库可以控制多种类型的舵机。


该库利用ESP32的PWM定时器,最多可以控制16个独立通道上的舵机。


目前还没有尝试在同一通道上支持多个舵机。


舵机控制快门按钮

此任务模拟舵机控制快门按钮,实际上只是让舵机旋转一定的角度并回到原始位置即可。


任务拆解成两部分:

1. 舵机接收到命令开始旋转;

2. 持续一定时间后舵机往反方向旋转回到原始位置;


硬件连接

舵机有三根线:

1. 红色,接电源,需要5V供电,不然3.3V带不起来;

2. 棕色,接GND;

3. 黄色,控制管脚,PWM控制信号接在此管脚上,这里选择数字管脚16;

由于我的开发板是3V3供电,但是点击需要5V供电,因此用外部电源给电机供电,但是两个电源的GND连在一起。最后的实物连接如下图所示:


Pasted image 20241125191247-servo-实物连接关系.png


舵机控制

舵机初始化

初始化舵机,非常简单。


Pasted image 20241125191343-setup-servo.png


舵机旋转

舵机旋转用一个状态机来控制,先正转一定的时间,然后反转一定的时间,最后停止,结束状态机。


注意 my_snap_flag 表示值为时才开始转动舵机,这个变量只有在手机通过BLE的 WRITE 属性写入 snap 字符串时才置1,即手机控制舵机触发动作。


Pasted image 20241125191441-loop-server-task.png


Pasted image 20241125191719-servo-snap.png


蓝牙回调

手机连接到BLE,往 WRITE 属性写入 snap 字符串,在 Server 端的 onWrite 回调中检查字符串为 snap 时,才调用 servo_snap_activate(),此时舵机才开始转动。


Pasted image 20241125191746-ble-onwrite-servo-snap.png


成果视频


eepw-diy-s3-ble-servo.gif





关键词: ble     servo     notify     write    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]