LV04-天猫蓝牙Mesh项目-02-初级开发-02-端-硬件开发

本文主要是天猫蓝牙Mesh项目——初级开发 端-硬件开发 的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows版本 windows11
Ubuntu版本 Ubuntu22.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
点击查看本文参考资料
分类 网址 说明
官方网站 阿里云 阿里云官网主页
阿里生活物联平台 生活物联网平台(飞燕平台)主页
AliGenie 天猫精灵开放平台AliGenie主页
阿里物联网平台 阿里物联网平台主页
Bluetooth 技术网站 蓝牙协议规范什么的可以来这里找
Telink Telink | Chips for a Smarter IoT (telink-semi.com)
Telink中文官网
开发手册 AliOS Things开发指南 AliOS Things开发指南,这里是最新版本,可以直接从官网找到
AliOS Things开发指南 AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档
AliOS Things开发指南(3.0) AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档
生活物联网平台开发文档 生活物联网平台(飞燕平台)开发文档
《设备端开发指南》
Wi-Fi IoT品类定义与功能开发 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发
硬件平台 mk3080 WiFi开发板 WiFi开发板使用指南-阿里云开发者社区
esp8266开发板 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com)
TLSR8258 Datasheet Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258
参考资料 AliOS Things 3.0 应用开发指南 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考
IP知识百科 - 华为 (huawei.com) IP的一些相关知识点
点击查看相关文件下载
分类 网址 说明
蓝牙规范相关文档 Core Specification 5.2 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。
《Core_v5.2.pdf》
Mesh Model(v1.1) 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。
本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。
《MshMDL_v1.1.pdf》
Mesh Profile(v1.0.1) 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。
《MshPRFv1.0.1.pdf》
Mesh Device Properties 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。
但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》
GATT Specification Supplement GATT Specification Supplement | Bluetooth® Technology Website。
好像可以在线看:《GATT Specification Supplement》
Assigned Numbers GATT的一些类型定义可以在这里找。
AliOS Things alios-things/AliOS-Things Gitee上的AliOSThings SDK源码仓库
alibaba/AliOS-Things GitHub上的AliOSThings SDK源码仓库
天猫精灵蓝牙Mesh协议栈 alibaba-archive/genie-bt-mesh-stack GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。
之前是在alibaba/genie-bt-mesh-stack这个仓库。
写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a
蓝牙Mesh设备开发指南 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容

这一LV的笔记起始跟前面有所重叠,互相补充吧算是。

一、泰凌微TLSR8258

1. 模块实物图

泰凌微8258芯片手册可以在线查阅:[DS_TLSR8258-E_Datasheet for Telink BLE+IEEE802.15.4 Multi-Standard Wireless SoC TLSR8258.pdf (telink-semi.cn)](https://wiki.telink-semi.cn/doc/ds/DS_TLSR8258-E_Datasheet for Telink BLE+IEEE802.15.4 Multi-Standard Wireless SoC TLSR8258.pdf),他就是下图中左侧扣开盖板后里面的这个芯片:

TLSR8258模块

给这个开发板下载程序需要使用烧录器:

烧录器和8258

2. TLSR8258 SOC框图

image-20231230100733856

具体的外设和介绍可以看芯片手册。

二、开发环境搭建

1. SDK下载

天猫精灵开发SDK网址:alibaba-archive/genie-bt-mesh-stack: genie-bt-mesh-stack (github.com)

image-20231230101018515

当时下载的时候应该是这次提交:change for build tg7100b and ch6121evb · alibaba-archive/genie-bt-mesh-stack@faf5236 (github.com)

2. 开发环境

这里我们需要选择windows开发环境,这是因为天猫精灵开发SDK在编译的时候用到的一些工具在linux下是无法运行的,所以目前来讲使能使用windows。windows下开发环境选择:

  • 编辑器:VS Code
  • 编译工具:aos-cube(安装依赖python命令)
  • SDK:天猫精灵提供
  • 烧录工具:Telink BDT.exe

3. 环境搭建

3.1 python安装

3.1.1 python下载

python可以去官网下载安装程序:Python Releases for Windows | Python.org

image-20231230104230800

3.1.2 安装步骤

  • (1)双击对应的可执行文件打开
安装python1
  • (2)勾选添加环境变量
安装python2
  • (3)点击下一步
安装python3
  • (4)选择要安装的路径
安装python4
  • (5)等待安装完毕
安装python5
  • (6)安装成功提示
安装python6

3.1.3 验证是否安装成功

Win+R打开运行框

测试python

然后输入python -V命令,显示版本说明安装成功:

测试python1

3.2 aos-cube安装

  • (1)python -m pip install --upgrade pip
安装aos cube1 安装aos cube2
  • (2)python -m pip install setuptools
安装aos cube3
  • (3)python -m pip install wheel
安装aos cube4
  • (4)python -m pip install aos-cube
安装aos cube5
  • (5)aos-cube 验证安装是否成功
安装aos cube6

然后输入y,可以看到有如下打印信息:

安装aos cube7
  • (6)打印版本
安装aos cube8

3.3 VS Code

3.3.1 vscode下载

我们直接去官网下最新版本就行了:Visual Studio Code - Code Editing. Redefined

3.3.2 安装软件

  • (1)双击可执行文件
安装VS Code
  • (2)同意协议
安装VS Code1
  • (3)选择安装位置
安装VS Code2
  • (4)选择下一步
安装VS Code3
  • (5)创建快捷方式,添加环境变量
安装VS Code4
  • (6)点击安装
安装VS Code5
  • (7)安装中……
安装VS Code6
  • (8)安装成功
安装VS Code7

3.3.3 配置VS Code 中文

VS Code配置1 VS Code配置2

3.3.4 配置VS Code C/C++插件

VS Code配置3

3.4 SDK安装

sdk就是全面在github下载的,我们选这次提交下的:alibaba-archive/genie-bt-mesh-stack at faf523618a6a2560090fc423222b9db80984bb7a (github.com)

SDK安装 SDK安装1 SDK安装2 SDK安装3 SDK安装4 SDK安装5

3.5 串口驱动安装

其实以前装过CH340驱动的话,也可以不用管,或者是自己装一个CH340驱动也行,这里主要是要安装一个USB转串口的驱动。

串口驱动安装1 串口驱动安装2 串口驱动安装3 串口驱动安装4 串口驱动安装5 串口驱动安装6

4. 工程编译

4.1 查看helloworld工程

①、系统时钟配置

查看系统时钟

②、串口波特率配置

查看波特率配置

4.2 编译工程

①、编译命令:aos make bluetooth.helloworld@tc825x

生成helloworld程序

②、生成可执行文件位置

生成helloworld程序1

5. 烧录程序

5.1 烧录硬件接线

设备 电源正极 烧录引脚 电源负极你
烧录器 3V3 SWM GND
泰凌微8258 3.3V PA7 GND
硬件接线

5.2 烧录工具安装

  • (1)解压工具
烧录工具安装1
  • (2)打开烧录软件
烧录工具安装2

5.3 烧录工具使用

  • (1)选择烧录设备
烧录工具使用1
  • (2)打开要烧录的文件
烧录工具使用2 烧录工具使用3 烧录工具使用4
  • (3)验证是否识别到蓝牙模块
烧录工具使用5
  • (4)烧录程序
烧录工具使用6

6. 程序现象

  • (1)查看端口号
查看端口号
  • (2)打开串口调试工具
串口打印1
  • (3)串口工具配置
串口打印2
  • (5)查看打印信息
串口打印3

三、硬件控制

1. LED控制实验

1.1 LED接在哪?

TLSR8258模块资料

由上图丝印可知,三个LED灯可以通过跳线帽接在对应的GPIO引脚上:

1
2
3
Red   : PB4	
Green : PB5
Blue : PC1

1.2 LED亮灭基本原理

image-20231230105319303

1.3 LED控制代码实现

这里是一个基本框架,具体的代码可以看这里:my-genie-bt-mesh-stack/app/example/bluetooth/my_gpio_led at master · sumumm/my-genie-bt-mesh-stack (github.com)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <gpio.h>

//填充要用的GPIO引脚
gpio_dev_t gpio;
gpio.port = LED_PIN;
gpio.config = OUTPUT_PUSH_PULL;

//初始化GPIO引脚
hal_gpio_init(&gpio);

//输出高电平
hal_gpio_output_high(&gpio);

//输出低电平
hal_gpio_output_low(&gpio);

//电平翻转
hal_gpio_output_toggle(&gpio);

2. 风扇控制实现

2.1 风扇实物图

风扇

2.2 各部分说明

L9110风扇模块

我们使用的是L9110H芯片来驱动电机。芯片手册可以看这里:XBLW-L9110 (szlcsc.com)

2.3 风扇电机驱动原理

2.3.1 L9110芯片特性

  • 控制和驱动电机

  • 两通道推挽式功率放大专用集成电路器件

  • 电压范围: 2.5V-12V(但是我在使用过程中接了5V,发热特别大,而且驱动状态也不太对,后来就接的3.3V了)。

  • 每通道具有 800mA 连续电流输出能力 输出具有正转、反转、高阻和刹车四种状态

2.3.2 L9110引脚定义

L9110引脚定义1

各个引脚的含义如下表格:

L9110引脚定义2

2.3.3 控制电路

控制电路

输入端不同信号对应的状态如下:

引出端波形

其实正反转都是我们自己定义的,这里知道这个原理就可以了。注意:当输入A或者输入B只有一个悬空的时候,风扇都会转。

2.4 实现风扇控制

2.4.1 GPIO引脚选择

引脚选择如下,为了控制风速,我们其实可以选择带PWM输出的引脚:

1
2
INA —— PD2
INB —— PD3
image-20231230110454170

2.4.2 实现PWM相关函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct {
#if defined(BOARD_TC825X)
float duty_cycle; /* 当用泰凌微8258时,周期在0 ~ 1之间 */
#else
uint32_t duty_cycle; /* 周期 */
#endif
uint32_t freq; /* 频率 */
} pwm_config_t;

//PWM引脚初始化
int32_t hal_pwm_init(pwm_dev_t *pwm);
//开始PWM波计数
int32_t hal_pwm_start(pwm_dev_t *pwm);
//停止PWM波计数
int32_t hal_pwm_stop(pwm_dev_t *pwm);
//改变PWM占空比
int32_t hal_pwm_para_chg(pwm_dev_t *pwm, pwm_config_t para);
//重置PWM引脚功能
int32_t hal_pwm_finalize(pwm_dev_t *pwm);

2.4.3 PWM初始化和控制实现

源码如下,也可以看这里:my-genie-bt-mesh-stack/app/example/bluetooth/my_fan_ctl at 6dcae9c8597bafb3876b71646183ba4cd0056c1d · sumumm/my-genie-bt-mesh-stack (github.com)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//引脚 INA = PD2	INB = PD3
#define INA_PIN TC825X_GET_PIN_NUM(GPIO_PWM3D2)
#define INB_PIN TC825X_GET_PIN_NUM(GPIO_PWM1ND3)

#define DEFAULT_CYCLE 0.0 //默认占空比
#define PWM_FREQ 300000 //频率

typedef enum {
FOREWARD, //正转
REVERSAL, //反转
STOP //停止
}fan_status; //风扇状态

static pwm_dev_t ina,inb;

static fan_status current_status = FOREWARD;
static float current_speed = DEFAULT_CYCLE;

//初始化风扇引脚
static u8_t fan_init(void)
{

ina.port = INA_PIN; //PD2
ina.config.duty_cycle = DEFAULT_CYCLE; //0.0 占空比 0%
ina.config.freq = PWM_FREQ;
hal_pwm_init(&ina);
hal_pwm_start(&ina);

inb.port = INB_PIN; //PD3
inb.config.duty_cycle = DEFAULT_CYCLE; //0.0 占空比 0%
inb.config.freq = PWM_FREQ;
hal_pwm_init(&inb);
hal_pwm_start(&inb);
printf("风扇初始化完成\r\n");

return 0;
}

static uint8_t fan_ctrl(fan_status status, float speed)
{
if(speed > 1 || speed < 0)
{
printf("speed error\r\n");
return 1;
}
switch(status)
{
case FOREWARD: //正转
hal_pwm_stop(&ina);
hal_pwm_stop(&inb);
//INA 高电平 INB 低电平
ina.config.duty_cycle = speed; //0.0 占空比 0%
hal_pwm_para_chg(&ina,ina.config);

inb.config.duty_cycle = 0; //0.0 占空比 0%
hal_pwm_para_chg(&inb,inb.config);
//开始PWM波输出
hal_pwm_start(&ina);
hal_pwm_start(&inb);

break;

case REVERSAL: //翻转
hal_pwm_stop(&ina);
hal_pwm_stop(&inb);
//INA 低电平 INB 高电平
ina.config.duty_cycle = 0; //0.0 占空比 0%
hal_pwm_para_chg(&ina,ina.config);
inb.config.duty_cycle = speed;
hal_pwm_para_chg(&inb,inb.config);
//开始PWM波输出
hal_pwm_start(&inb);
hal_pwm_start(&ina);

break;
case STOP:
hal_pwm_stop(&ina);
hal_pwm_stop(&inb);

break;

default:
printf("status error\r\n");
return 1;

}
current_status = status;
current_speed = speed;
return 0;

}


功能实现:20%占空比正转3秒,停顿3秒,再30%占空比反转3秒,停顿3秒:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int application_start(int argc, char **argv)
{
genie_init();
aos_msleep(5000);
while(1)
{
printf("正转3秒\r\n");
fan_ctrl(FOREWARD, 0.2);
aos_msleep(3000);

printf("暂停3秒\r\n");
fan_ctrl(STOP, 0);
aos_msleep(3000);

printf("反转3秒\r\n");
fan_ctrl(REVERSAL, 0.3);
aos_msleep(3000);

printf("暂停3秒\r\n");
fan_ctrl(STOP, 0);
aos_msleep(3000);

}

return 0;
}

3. 按键中断实现

3.1 开发板中的按键

按键

3.2 万用表实测引脚

由于这个模块没有原理图,硬件上的一些按键要用万用表去测量。测量后可以知道引脚编号如下:

1
2
3
SW3 = PA0 // 用作了串口接收
SW2 = PC4
SW1 = PC3
万用表使用

3.3 实现按键触发

在 platform/mcu/tc32_825x/vendor/common/alios_app_config.h 文件里开启宏GPIO中断宏:

1
#define GPIO_IRQ_ENABLE					1

功能实现:按下SW1风扇加速、按下SW2风扇减速,按键SW3不使用。代码如下,也可以看这里:my-genie-bt-mesh-stack/app/example/bluetooth/my_fan_ctl at e02b131cc36942ed8a5eed408d08d5f32edc5f37 · sumumm/my-genie-bt-mesh-stack (github.com)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <gpio.h>

#define KEY_SW1 TC825X_GET_PIN_NUM(GPIO_PC3)
#define KEY_SW2 TC825X_GET_PIN_NUM(GPIO_PC4)


static gpio_dev_t key_sw1,key_sw2;

static fan_status current_status = FOREWARD; //初始化为正转
static float current_speed = DEFAULT_CYCLE; //占空比默认为0

void key_irq_handler(void *arg)
{
gpio_dev_t *key = (gpio_dev_t *)arg;

switch(key->port)
{
case KEY_SW1: //PC3
current_speed += 0.1;
if(current_speed > 1)
current_speed = 1;
printf("KEY_SW1触发\r\n");
break;

case KEY_SW2: //PC4
current_speed -= 0.1;
if(current_speed < 0)
current_speed = 0;
printf("KEY_SW2触发\r\n");
break;

default:
return ;

}
//printf未实现打印浮点类型
uint8_t tmp = (uint8_t)(current_speed*100);
printf("current_status = %d,current_speed = %u%%\r\n",current_status,tmp);
fan_ctrl(current_status,current_speed);
return ;
}

// 由于没有原理图,所以这里按键中断触发选择了下降沿,因为肯定上升下降沿都有
static uint8_t key_init(void)
{
//引脚初始化
key_sw1.port = KEY_SW1; //PC3
key_sw1.config = INPUT_PULL_UP;
hal_gpio_init(&key_sw1);
//开启下降沿触发中断
hal_gpio_enable_irq(&key_sw1, IRQ_TRIGGER_FALLING_EDGE, key_irq_handler,&key_sw1);

key_sw2.port = KEY_SW2; //PC4
key_sw2.config = INPUT_PULL_UP;
hal_gpio_init(&key_sw2);
//开启下降沿触发中断
hal_gpio_enable_irq(&key_sw2, IRQ_TRIGGER_FALLING_EDGE, key_irq_handler,&key_sw2);


printf("初始化按键\r\n");

return 0;
}