物联网开发笔记(56)- 使用Micropython开发ESP32开发板之手机蓝牙控制舵机
创始人
2024-03-16 14:32:37

一、目的

        这一节我们学习如何使用我们的ESP32开发板来实现通过蓝牙控制接在ESP32开发板上的舵机。

二、环境

        ESP32 + MG90S舵机 + Thonny IDE + 几根杜邦线 + 手机

        舵机的链接方法见第54节:物联网开发笔记(54)- 使用Micropython开发ESP32开发板之控制MG90S舵机_魔都飘雪的博客-CSDN博客

三、手机APP

        这里用到的手机APP是BluefruitConnect,使用苹果手机的同学打架早Apple Store中直接搜索安装即可。安卓暂时我没找到这个APP,哪位同学有的可以评论区留言哈。。。

BluefruitConnect APP的图标是这个样子:

 安卓的同学我们使用:BLE调试助手:

 

几款常用的ble调试app(nRF Connect、BLE调试助手、LightBlue) - 知乎

四、代码

from machine import Pin
from machine import Timer  # 导入定时器
from time import sleep_ms
from machine import PWM   # 导入PWM
import time
import bluetooth  # 导入蓝牙BLE_MSG = ""  # 定义一个变量来接收蓝牙发送来的数据# 创建一个蓝牙类
class ESP32_BLE():def __init__(self, name):  # 蓝牙类的初始化self.led = Pin(2, Pin.OUT)  # 创建LED对象self.timer1 = Timer(0)  # 使用0号定时器,ESP32共有4个定时器0,1,2,3self.name = name  # 传入蓝牙名字self.ble = bluetooth.BLE()  # 创建蓝牙对象self.ble.active(True)  # 打开蓝牙self.ble.config(gap_name=name)  # 设置蓝牙的名字self.disconnected()  # 断开蓝牙连接self.ble.irq(self.ble_irq)  # 蓝牙中断self.register() # 蓝牙注册self.advertiser()def connected(self):self.led.value(1)self.timer1.deinit()def disconnected(self):        self.timer1.init(period=100, mode=Timer.PERIODIC, callback=lambda t: self.led.value(not self.led.value()))def ble_irq(self, event, data):global BLE_MSGif event == 1: #_IRQ_CENTRAL_CONNECT 手机链接了此设备self.connected()elif event == 2: #_IRQ_CENTRAL_DISCONNECT 手机断开此设备self.advertiser()self.disconnected()elif event == 3: #_IRQ_GATTS_WRITE 手机发送了数据 buffer = self.ble.gatts_read(self.rx)BLE_MSG = buffer.decode('UTF-8').strip()def register(self):        service_uuid = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'reader_uuid  = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'sender_uuid  = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'services = ((bluetooth.UUID(service_uuid), ((bluetooth.UUID(sender_uuid), bluetooth.FLAG_NOTIFY), (bluetooth.UUID(reader_uuid), bluetooth.FLAG_WRITE),)), )((self.tx, self.rx,), ) = self.ble.gatts_register_services(services)def send(self, data):self.ble.gatts_notify(0, self.tx, data + '\n')def advertiser(self):name = bytes(self.name, 'UTF-8')adv_data = bytearray('\x02\x01\x02') + bytearray((len(name) + 1, 0x09)) + nameself.ble.gap_advertise(100, adv_data)print(adv_data)print("\r\n")# 创建BOOT按键中断执行函数
def buttons_irq(pin):led.value(not led.value())  # 翻转LED灯的状态print('LED is ON.' if led.value() else 'LED is OFF')  # 打印LED的状态ble.send('LED is ON.' if led.value() else 'LED is OFF')  # 发送LED的状态给手机if __name__ == "__main__":ble = ESP32_BLE("ESP32BLE")  # 定义蓝牙的名字为ESP32BLE# 检测boot按键but = Pin(0, Pin.IN)  # 创建BOOT按键对象,GPIO脚为0# 创建BOOT按键的中断,中断出发模式设置为下降沿触发,触发对象为buttons_irqbut.irq(trigger=Pin.IRQ_FALLING, handler=buttons_irq)  # 控制蓝色ledled = Pin(2, Pin.OUT)  # 创建LED对象# 控制舵机p15 = PWM(Pin(15))  # 创建舵机对象p15.freq(50)  # PWM的频率为59HZduty_num = 1638  # 定义一个变量,设置舵机的角度为0度p15.duty_u16(1638)# 0度    p15.duty_u16(1638)# 45度   p15.duty_u16(3276)# 90度   p15.duty_u16(4915)# 135度  p15.duty_u16(6553)# 180度  p15.duty_u16(8192)# 下面ESP32按照蓝牙接收到的数据进行判断,执行响应的动作while True:if BLE_MSG == 'read_LED':print(BLE_MSG)  # 打印接收到的信息BLE_MSG = ""print('LED is ON.' if led.value() else 'LED is OFF')ble.send('LED is ON.' if led.value() else 'LED is OFF')elif BLE_MSG:print("接收到的信息:>>%s<<" % BLE_MSG)  # 打印接收到的信息if BLE_MSG == "!B11:":  # 按下app上数字1duty_num += 100if duty_num > 8192:duty_num = 8192print(duty_num)p15.duty_u16(duty_num)elif BLE_MSG == "!B219":  # 按下app上数字2duty_num -= 100if duty_num < 1638:duty_num = 1638print(duty_num)p15.duty_u16(duty_num)elif BLE_MSG == "!B318":  # 按下app上数字3duty_num += 300if duty_num > 8192:duty_num = 8192print(duty_num)p15.duty_u16(duty_num)elif BLE_MSG == "!B417":  # 按下app上数字4duty_num -= 300if duty_num < 1638:duty_num = 1638print(duty_num)p15.duty_u16(duty_num)elif BLE_MSG == "!B516":  # 按下app上up键p15.duty_u16(4915)  # 90度duty_num = 4915elif BLE_MSG == "!B615":  # 按下app上down键p15.duty_u16(3276)  # 45度duty_num = 3276elif BLE_MSG == "!B714":  # 按下app上left键p15.duty_u16(8192)  # 180度duty_num = 8192elif BLE_MSG == "!B813":  # 按下app上right键p15.duty_u16(1638)  # 0度duty_num = 1638BLE_MSG = ""sleep_ms(100)'''此处,讲解一下手机蓝牙发送的按键的指令,针对苹果手机APP:按钮1,2,3,4,上,下,左,右分别对应指令的第三位“!Bxxx”z指令!Bxxx,前两位是固定格式,第三位是按钮的ID,按钮1到4的ID就是1到4. 按钮上下左右对应的ID是5到8.比如:按钮5对应的指令就是!B5xx。指令的第四为指的是按钮是按下还是释放,按下是1,释放是0.'''

五、苹果手机APP操作

        大家下载完成后,按照图片中操作即可,注意先运行程序哈:

 

 分别按1,2,3,4,上,下,左,右,BOOT键后Thonny IDE打印如下:

 五、安卓手机APP操作

         操作可参考如下图片,注意先运行程序哈:

BLE调试助手界面:

 

 

 

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...