挑战进阶任务
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
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()
这个函数非常简单:
1. 只有当有设备连接到BLE时,才会调用函数 build_upload_msg() 把光照强度封装成字符串,然后通过 NOTIFY 属性上报给手机;
2. 此函数管理设备连接状态,当设备断开连接时,又重新开启广播。
构造光照强度上报信息
此函数仅仅把光照强度封装在字符串中,为了方便仅仅用一个字符串来表示。如果后期需要上报更多消息,可以封装成 JSON 格式方便解析和管理。
舵机
模块介绍
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连在一起。最后的实物连接如下图所示:
舵机控制
舵机初始化
初始化舵机,非常简单。
舵机旋转
舵机旋转用一个状态机来控制,先正转一定的时间,然后反转一定的时间,最后停止,结束状态机。
注意 my_snap_flag 表示值为时才开始转动舵机,这个变量只有在手机通过BLE的 WRITE 属性写入 snap 字符串时才置1,即手机控制舵机触发动作。
蓝牙回调
手机连接到BLE,往 WRITE 属性写入 snap 字符串,在 Server 端的 onWrite 回调中检查字符串为 snap 时,才调用 servo_snap_activate(),此时舵机才开始转动。
成果视频