1# 小凌派-RK2206开发板OpenHarmonyOS开发-智慧井盖 2 3## 实验内容 4 5本例程演示如何在小凌派-RK2206开发板上实现智慧井盖应用案例。 6 7 8 9## 硬件资源 10 11硬件资源图如下所示: 12 13 14EEPROM 24C02的设备地址为:0x1010001* ; 15六轴传感器 MPU6050 的设备地址为:0x1101000* 16 17## 硬件接口说明 18 19引脚名称开发者可在硬件资源图中查看,也可在智慧井盖模块背面查看。 20 21| 引脚名称 | 功能描述 | 22| :--- | :------- | 23| MPU6050_INT | MPU6050中断输出 | 24| Normal_CTR | LED控制线,低电平有效 | 25| Tilt_Warning_CTR | LED控制线,低电平有效 | 26| I2C_SCL |I2C时钟信号线 | 27| I2C-SDA | I2C数据信号线 | 28| GND | 电源地引脚 | 29| 3V3 |3.3V电源输入引脚 | 30| GND | 电源地引脚 | 31 32## 硬件设计 33 34硬件电路如下图所示: 35 36 37模块整体硬件电路如上图所示,电路中包含了E53接口连接器,EEPROM存储器、MPU6050传感器,LED指示灯电路,其中EEPROM存储器、MPU6050传感器为数字接口芯片,直接使用I2C总线控制,电路简单,本文不再过多说明。 38 39### 硬件连接 40 41小凌派开发板与模块均带有防呆设计,故很容易区分安装方向,直接将模块插入到开发板的E53母座接口上即可,安装图如下所示: 42 43 44## 程序设计 45 46### API分析 47 48MPU6050寄存器手册 49/vendor/lockzhiner/lingpi/docs/datasheet/sensor/MPU-6000 and MPU-6050 Register Map and Descriptions.pdf 50 51**头文件:** 52 53/vendor/lockzhiner/lingpi/samples/e53_smart_city/include/e53_smart_city.h 54 55#### e53_sc_init() 56 57```c 58void e53_sc_init(); 59``` 60 61**描述:** 62 63E53智慧井盖模块初始化,包括初始化I2C0、LED1灯GPIO、LED2灯GPIO;初始化MPU6050传感器。 64 65**参数:** 66 67无 68 69**返回值:** 70 71无 72 73#### mpu6050_write_reg() 74 75```c 76void mpu6050_write_reg(uint8_t reg, uint8_t data); 77``` 78 79**描述:** 80 81E53智慧井盖模块MPU6050传感器写寄存器。 82 83**参数:** 84 85|名字|描述| 86|:--|:------| 87| reg | 寄存器 | 88| data | 写入的寄存器值 | 89 90**返回值:** 91 92无 93 94#### mpu6050_read_data() 95 96```c 97void mpu6050_read_data(uint8_t reg, unsigned char *buf, uint8_t length); 98``` 99 100**描述:** 101 102E53智慧井盖模块MPU6050传感器读寄存器。 103 104**参数:** 105 106|名字|描述| 107|:--|:------| 108| reg | 寄存器 | 109| buf | 读寄存器缓冲区指针 | 110| length | 读寄存器长度 | 111 112**返回值:** 113 114无 115 116#### MPU6050_Read_Buffer() 117 118```c 119uint8_t MPU6050_Read_Buffer(uint8_t reg, uint8_t *p_buffer, uint16_t length); 120``` 121 122**描述:** 123 124E53智慧井盖模块读取多个MPU6050寄存器值。 125 126**参数:** 127 128|名字|描述| 129|:--|:------| 130| reg | 寄存器 | 131| p_buffer | 读缓冲区指针 | 132| length | 读取寄存器长度 | 133 134**返回值:** 135 136|返回值|描述| 137|:--|:------| 138| 0 | 成功 | 139| 非0值 | 失败,返回错误值 | 140 141#### mpu6050_read_acc() 142 143```c 144void mpu6050_read_acc(short *acc_data); 145``` 146 147**描述:** 148 149E53智慧井盖模块读取MPU6050的角速度数据。 150 151MPU6050_ACC_OUT角速度数据寄存器,只读,包括X轴、Y轴和Z轴。 152 153 154 155**参数:** 156 157|名字|描述| 158|:--|:------| 159| acc_data | 读取的角速度数据指针,包括X轴、Y轴、Z轴数据 | 160 161**返回值:** 162 163无 164 165#### mpu6050_read_id() 166 167```c 168uint8_t mpu6050_read_id(); 169``` 170 171**描述:** 172 173E53智慧井盖模块读取MPU6050的ID,读取值为0x68返回成功;否则,返回失败。 174 175MPU6050_RA_WHO_AM_I寄存器,只读,默认值0x68。 176 177 178 179**参数:** 180 181无 182 183**返回值:** 184 185|返回值|描述| 186|:--|:------| 187| 0 | 失败 | 188| 1 | 成功 | 189 190#### mpu6050_init() 191 192```c 193void mpu6050_init(); 194``` 195 196**描述:** 197 198E53智慧井盖模块初始化MPU6050传感器。 199 200MPU6050_RA_PWR_MGMT_1电源管理寄存器,DEVICE_RESET复位唤醒传感器。 201 202 203 204MPU6050_RA_INT_ENABLE中断使能寄存器,中断控制。 205 206 207 208MPU6050_RA_USER_CTRL用户控制寄存器,关闭I2C主模式。 209 210 211 212MPU6050_RA_FIFO_EN FIFO使能寄存器,关闭FIFO。 213 214 215 216MPU6050_RA_INT_PIN_CFG INT管脚/旁路控制寄存器。 217 218 219 220MPU6050_RA_CONFIG配置寄存器,配置为外部引脚采样,DLPF数字低通滤波器。 221 222 223 224MPU6050_RA_ACCEL_CONFIG加速配置寄存器,配置加速度传感器量程和高通滤波器。 225 226 227 228**参数:** 229 230无 231 232**返回值:** 233 234无 235 236#### e53_sc_read_data() 237 238```c 239void e53_sc_read_data(e53_sc_data_t *p_data); 240``` 241 242**描述:** 243 244E53智慧井盖模块读取传感器数据。 245 246**参数:** 247 248|名字|描述| 249|:--|:------| 250| data | 读取的传感器数据指针,包括X轴、Y轴、Z轴数据 | 251 252**返回值:** 253 254无 255 256#### led_d1_set() 257 258```c 259void led_d1_set(SWITCH_STATUS_ENUM status); 260``` 261 262**描述:** 263 264E53智慧井盖模块控制LED1告警状态灯开关。 265 266**参数:** 267 268|名字|描述| 269|:--|:------| 270| status | LED灯状态,ON:开;OFF:关 | 271 272**返回值:** 273 274无 275 276#### led_d2_set() 277 278```c 279void led_d2_set(SWITCH_STATUS_ENUM status); 280``` 281 282**描述:** 283 284E53智慧井盖模块控制LED2正常状态灯开关。 285 286**参数:** 287 288|名字|描述| 289|:--|:------| 290| status | LED灯状态,ON:开;OFF:关 | 291 292**返回值:** 293 294无 295 296### 主要代码分析 297 298在e53_sc_thread函数中,每2s读取一次传感器数据并打印X轴、Y轴和Z轴数据。首次读取传感器数据时,保存X轴、Y轴和Z轴数据,用于与之后的传感器数据进行对比。当X轴、Y轴和Z轴与第一次读取保存的X轴、Y轴和Z轴数据差值大于100时,认为井盖倾斜,点亮LED2告警状态灯,关闭LED1正常状态灯;否则认为井盖没有倾斜,关闭LED2告警状态灯,打开LED1正常状态灯。 299 300```c 301void e53_sc_thread() 302{ 303 e53_sc_data_t data; 304 int x = 0, y = 0, z = 0; 305 306 e53_sc_init(); 307 led_d1_set(OFF); 308 led_d2_set(OFF); 309 310 while (1) 311 { 312 e53_sc_read_data(&data); 313 printf("x is %d\n", (int)data.accel[0]); 314 printf("y is %d\n", (int)data.accel[1]); 315 printf("z is %d\n", (int)data.accel[2]); 316 printf("init x:%d y:%d z:%d\n", x, y, z); 317 318 if (x == 0 && y == 0 && z == 0) 319 { 320 x = (int)data.accel[0]; 321 y = (int)data.accel[1]; 322 z = (int)data.accel[2]; 323 } 324 else 325 { 326 if ((x + DELTA) < data.accel[0] || (x - DELTA) > data.accel[0] || 327 (y + DELTA) < data.accel[1] || (y - DELTA) > data.accel[1] || 328 (z + DELTA) < data.accel[2] || (z - DELTA) > data.accel[2]) 329 { 330 /*倾斜告警*/ 331 led_d1_set(OFF); 332 led_d2_set(ON); 333 data.tilt_status = 1; 334 printf("tilt warning \nLED1 OFF LED2 On\n"); 335 } 336 else 337 { 338 led_d1_set(ON); 339 led_d2_set(OFF); 340 data.tilt_status = 0; 341 printf("normal \nLED1 ON LED2 OFF\n"); 342 } 343 } 344 LOS_Msleep(2000); 345 } 346} 347``` 348 349## 编译调试 350 351### 修改 BUILD.gn 文件 352 353修改 `vendor/lockzhiner/lingpi/sample` 路径下 BUILD.gn 文件,指定 `c2_e53_smart_city` 参与编译。 354 355```r 356"c2_e53_smart_city", 357``` 358 359 360### 运行结果 361 362例程代码编译烧写到开发板后,按下开发板的RESET按键,通过串口软件查看日志,串口会打印X、Y、Z轴加速度信息、倾斜告警状态和指示灯状态;倾斜智慧井盖模块开发板,智慧井盖模块上的倾斜状态灯LED2会被点亮。 363 364```r 365x is 149 366y is 21 367z is 1822 368init x:144 y:24 z:1819 369normal 370LED1 ON LED2 OFF 371 372x is 154 373y is 749 374z is 1684 375init x:144 y:24 z:1819 376tilt warning 377LED1 OFF LED2 On 378``` 379 380