1、STM32 WBA55CG部分的代码
这里要感谢老师教程的分享,对于我这种完全没有用过STM32 的人,可以完成到目前的进度很难得。再次感谢老师的教程。
另外,电机的控制由于减速电机是可以调速的,但是由于需要驱动大电流,本人并没有很多的经验可以驱动起这个电机,然后就是,这个板子的IO我不敢随便接,所以,这里选择了驱动继电器来完成前进后退的.整个代码的完成还要感谢群里同学们的指导,感谢王哥的指导。
1.1 关于Keil和Cuba MX的环境搭建我就不重复赘述了。
1.2 再sdk的路径下有很多demo,我们以这个为基础做修改
D:\STM32\en.stm32cubewba-v1-5-0\STM32Cube_FW_WBA_V1.5.0\Projects\NUCLEO-WBA55CG\Applications\BLE,
这里选择BLE_p2pServer作为基础工程复制一份改名为BLE_p2peepw
修改PA7、PA6的引脚为GPIO输出
设置完成以后,电机右上角的生成代码,选择MDK-ARM
用keil打开这个工程的MDK工程
/** * @brief GPIO Initialization Function * @param None * @retval None */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 */ /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7|GPIO_PIN_6, GPIO_PIN_RESET); /*Configure GPIO pins : PA7 PA6 */ GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*RT DEBUG GPIO_Init */ RT_DEBUG_GPIO_Init(); /* USER CODE BEGIN MX_GPIO_Init_2 */ /* USER CODE END MX_GPIO_Init_2 */ }
GPIO 初始化的这个方法已经完成初始化的功能
在main.h 定义一下高低电平的方法
// 宏定义,简化 GPIO 操作 #define SET_PA7_HIGH() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET) #define SET_PA6_HIGH() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET) #define SET_PA7_LOW() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET) #define SET_PA6_LOW() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
如果需要控制PA7或者PA6高低电平,简单的调用这个方法可以(好像c语言不叫调用方法,不管了)。
SET_PA7_LOW()
SET_PA7_HIGH()
然后是蓝牙部分的功能
他原本的示例是接受0x00是关闭LD1,接受0x01是打开LD1,我在这个基础上改一下
0x04是前进
0x05是暂停
0x06是后退
/* Functions Definition ------------------------------------------------------*/ void P2P_SERVER_Notification(P2P_SERVER_NotificationEvt_t *p_Notification) { /* USER CODE BEGIN Service1_Notification_1 */ /* USER CODE END Service1_Notification_1 */ switch(p_Notification->EvtOpcode) { /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */ /* USER CODE END Service1_Notification_Service1_EvtOpcode */ case P2P_SERVER_LED_C_READ_EVT: /* USER CODE BEGIN Service1Char1_READ_EVT */ /* USER CODE END Service1Char1_READ_EVT */ break; case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT: /* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */ for (uint16_t i = 0; i < p_Notification->DataTransfered.Length; i++) { LOG_INFO_APP("-- P2P APPLICATION SERVER : Received Data[%d] = 0x%02X\n", i, p_Notification->DataTransfered.p_Payload[i]); } if(p_Notification->DataTransfered.p_Payload[1] == 0x04) { LOG_INFO_APP("-- P2P APPLICATION SERVER : 6666\n"); // 设置 PA7 和 PA6 为高电平 SET_PA7_HIGH(); SET_PA6_LOW(); } if(p_Notification->DataTransfered.p_Payload[1] == 0x05) { LOG_INFO_APP("-- P2P APPLICATION SERVER : 6666\n"); // 设置 PA7 和 PA6 为高电平 SET_PA7_HIGH(); SET_PA6_HIGH(); } if(p_Notification->DataTransfered.p_Payload[1] == 0x06) { LOG_INFO_APP("-- P2P APPLICATION SERVER : 6666\n"); // 设置 PA7 和 PA6 为高电平 SET_PA7_LOW(); SET_PA6_LOW(); } if(p_Notification->DataTransfered.p_Payload[1] == 0x01) { BSP_LED_On(LED_BLUE); LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n"); P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */ uint8_t led_data[2] = {0xAA, 0xAA}; P2P_SERVER_Data_t pData = { .p_Payload = led_data, .Length = sizeof(led_data) }; // 更新 LED 控制特征的值 P2P_SERVER_UpdateValue(P2P_SERVER_LED_C, &pData); } if(p_Notification->DataTransfered.p_Payload[1] == 0x00) { BSP_LED_Off(LED_BLUE); LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n"); P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */ } /* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */ break; case P2P_SERVER_SWITCH_C_NOTIFY_ENABLED_EVT: /* USER CODE BEGIN Service1Char2_NOTIFY_ENABLED_EVT */ P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_ON; LOG_INFO_APP("-- P2P APPLICATION SERVER : NOTIFICATION ENABLED\n"); LOG_INFO_APP(" \n\r"); /* USER CODE END Service1Char2_NOTIFY_ENABLED_EVT */ break; case P2P_SERVER_SWITCH_C_NOTIFY_DISABLED_EVT: /* USER CODE BEGIN Service1Char2_NOTIFY_DISABLED_EVT */ P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_OFF; LOG_INFO_APP("-- P2P APPLICATION SERVER : NOTIFICATION DISABLED\n"); LOG_INFO_APP(" \n\r"); /* USER CODE END Service1Char2_NOTIFY_DISABLED_EVT */ break; default: /* USER CODE BEGIN Service1_Notification_default */ /* USER CODE END Service1_Notification_default */ break; } /* USER CODE BEGIN Service1_Notification_2 */ /* USER CODE END Service1_Notification_2 */ return; }
附件代码 BLE_p2peepw.zip
到这里WBA55CG部分的代码就介绍完了。
2、电机的接线。
这个电机可以控制正反转,
注意,小车的电机,必须是一个正转一个反转,不然就是相反转动,这个车子是不会走的。
我这里使用了2个继电器,一个控制正反转,一个控制转动,PA7控制的是小车转动,PA6控制的是正反转,2个橙线接在常开,另外两个接在常闭。
所以PA7必须是高电平,小车开始转动,PA6可以随意,不管是高电平还是低电平,他都会往一个方向运动。
3、微信小程序部分代码
3.1 首先你需要下载微信开发者工具,当然如果你要用uniapp也可以完成这个任务,老师用的是原生微信小程序,那么就按照老师的步骤做。
我对界面的按钮做了一点优化。
这是以前做的配网程序,有上架到微信,就在这里面加一下小车控制的功能,就不单独做了。
这里注明一下,你在app.json里面新增文件路径,按ctrl s,会自动创建项目文件。
js是主要逻辑代码的文件
json是一些配置文件,例如title可以在这里设置。
wxml是界面文件
wxss是样式文件
(论坛的编辑器把代码跑掉了,我还是截图吧)
<button bindtap="openBluetoothAdapter" plain="true" type="primary">开始扫描</button><label class="top1"></label><button bindtap="stopBluetoothDevicesDiscovery" plain="true" type="primary">停止扫描</button><label class="top1"></label><button bindtap="closeBluetoothAdapter" plain="true" type="primary" >结束流程</button>
按钮加个tpye,就可以好看很多了,嘿嘿
表单组件 / button 参考微信表单的页面
这部分的代码是直接从老师的代码里面复制的
点击开始扫描以后,会发现wba55cg的蓝牙
老师这里用的createBLEConnection 方法作为点击外围设备按钮的方法
他这里把这一页拿到的参数跳到下一页。
这一页的代码就是我自己写的了,也参照了老师的部分功能。
他这里这一页会显示特征值、uuid等信息。
我加了三个按钮,但是由于三个按钮就计一起,中间使用一个label做隔开,top做了10px
下面是三个按钮的方法
经过测试,蓝牙发送的数据一切正确
下面可以微信扫描下面的小程序,选择只能小车来控制。
智能小车控制功能0x04,控制小车前进0x05,控制小车后退0x06,控制小车暂停
如果要上架,要更新微信的协议,在小程序后台。
这里必须更新才可以驱动蓝牙。这是上架的程序的的硬性规定。
下面是微信部分的代码,整个的配网程序是TCP配网,和这个项目无关,我只留小车部分的代码,有兴趣的可以复制到自己的工程中去实验。