【物联网】基于立创EDA与鸿蒙Hi3861的智能开关远程控制方案舵机联动篇最近有不少朋友在问想自己动手做一个能远程控制家里电灯、风扇的智能开关但又觉得市面上的成品要么太贵要么不够灵活。正好我之前用鸿蒙的Hi3861开发板和一个小舵机配合立创EDA画了个板子成功实现了这个想法。今天我就把这个从硬件设计到软件驱动的完整过程手把手分享给大家即使是嵌入式新手跟着做也能做出来。咱们这个方案的核心思路很简单用一块支持Wi-Fi的鸿蒙开发板Hi3861作为大脑它通过家里的路由器连接到手机App。当你用手机点击“开灯”时App通过网络给开发板发指令开发板再控制一个舵机转动用舵机的“手臂”去物理按压墙壁上的传统机械开关这样就实现了远程控制。听起来是不是很有趣下面咱们就从硬件设计开始。1. 硬件设计与选型打造智能开关的“身体”做硬件项目第一步永远是搞清楚我们需要什么然后把它画出来。这里我选择用立创EDA因为它是在线工具免费且对新手友好元件库也全。1.1 核心元件选型与作用整个系统的硬件核心就两块主控板和执行器。主控芯片鸿蒙Hi3861开发板这是整个项目的大脑。我选择它主要是因为自带Wi-Fi这是实现远程控制的基础Hi3861集成了Wi-Fi功能可以直接连家里的路由器省去了外接Wi-Fi模块的麻烦和成本。鸿蒙系统支持有成熟的鸿蒙轻量级系统LiteOS-M和开发框架写网络通信、控制GPIO的代码很方便社区资料也越来越多。性价比高对于控制一个舵机来说它的性能绰绰有余价格也亲民。执行器微型舵机这是实现“物理按压”动作的“手”。为什么选舵机而不是继电器呢因为我们控制的是机械开关需要一个来回摆动的机械动作。舵机可以根据我们给的信号精确地转动到特定角度。选型要点要选体积小、扭力足够的舵机。扭力太小可能按不动开关。我用的是一款9g微型舵机工作电压4.8V~6V扭力够用体积也小巧。1.2 使用立创EDA设计核心电路电路其实不复杂主要就是给Hi3861开发板和舵机供电以及把它们连接起来。这里有个关键点舵机的工作电流比单片机GPIO口能提供的电流大得多所以绝对不能直接用开发板的GPIO引脚去驱动舵机必须用三极管或者MOS管来做“功率开关”。下面是我在立创EDA里设计的核心驱动电路原理图部分咱们来拆解一下此处应插入一个简单的原理图截图或描述但根据指令我们以文字描述核心部分电路原理讲解电源部分整个系统需要一个稳定的5V电源。可以用一个5V/2A的USB电源适配器供电。电源进来后一路直接给舵机供电因为舵机工作电压就是5V左右另一路通过一个降压芯片比如AMS1117-3.3转换成3.3V给Hi3861开发板供电。舵机驱动电路关键Hi3861的一个GPIO引脚比如GPIO9输出控制信号。这个3.3V的微弱信号连接到NPN三极管如S8050的基极B。三极管的发射极E接地集电极C连接到舵机的信号线通常是橙色或白色线。舵机的正极红色线接5V电源负极棕色或黑色线接地。工作原理当Hi3861的GPIO输出高电平3.3V时三极管导通相当于把舵机的信号线拉低到接近地电平当GPIO输出低电平时三极管截止舵机信号线通过其内部电路变为高电平。通过快速切换GPIO的高低电平就能产生舵机需要的PWM波形。三极管在这里起到了一个“电子开关”和“电平转换/隔离”的作用保护了Hi3861的GPIO口。注意舵机的控制线虽然是信号线但在工作时也可能有较大的瞬时电流所以必须通过三极管或MOS管驱动切勿直连画好原理图后就可以在立创EDA里进行PCB布局和布线了。把元件摆放整齐电源线走粗一些信号线避免干扰。设计完成后可以直接在立创下单打板、购买元件非常方便。2. 鸿蒙系统开发环境搭建硬件在路上的时候咱们就可以先把软件开发环境搭起来。鸿蒙的开发主要基于Linux环境但Windows用户也可以通过Docker或虚拟机来搞。2.1 基础环境准备我习惯在Ubuntu 20.04下进行开发。你需要准备以下工具Python 3.7很多编译工具脚本是Python写的。hb工具这是鸿蒙的编译构建工具。通过pip安装pip install ohos-buildHi3861开发板SDK从鸿蒙官方Gitee仓库获取Hi3861的源码。你可以使用repo工具来拉取代码这是一个比较大的工程需要耐心等待。编译工具链用于将C代码编译成Hi3861能运行的二进制文件。SDK中一般会提供或者有详细的获取脚本。环境变量配置好后在SDK根目录下可以尝试执行hb set来设置工程路径然后hb build进行编译如果能看到编译成功的提示环境基本就OK了。2.2 创建你的第一个控制工程鸿蒙的代码有固定的目录结构。我们不需要从头创建最好的方法是在SDK提供的applications/sample/wifi-iot/app目录下复制一个现有的demo比如iothardware文件夹重命名为smart_switch。然后我们重点关注两个文件BUILD.gn这是编译脚本告诉系统如何编译你的代码。smart_switch.c这是我们编写主要逻辑代码的地方。在BUILD.gn里你需要定义这个应用的名称和源文件例如static_library(smart_switch) { sources [ smart_switch.c ] include_dirs [ //utils/native/lite/include, //kernel/liteos_m/components/cmsis/2.0, //base/iot_hardware/peripheral/interfaces/kits, ] }这段代码的意思是定义一个叫smart_switch的静态库它的源代码是smart_switch.c文件并且包含了后面这些头文件路径这样我们才能使用鸿蒙提供的GPIO、PWM等硬件操作接口。3. 软件驱动与逻辑实现环境好了工程建了现在来写最核心的代码让Hi3861连上Wi-Fi并控制舵机动起来。3.1 舵机驱动用PWM实现精准角度控制舵机是通过PWM脉冲宽度调制信号控制的。简单说就是需要在一个固定周期比如20ms的方波里通过改变高电平的持续时间脉宽来控制舵机角度。通常0.5ms脉宽对应0度2.5ms脉宽对应180度。鸿蒙的HDF驱动框架提供了PWM接口。但在实际项目中我发现Hi3861的PWM外设配置起来相对复杂而且我们只控制一个舵机用GPIO模拟PWM软件模拟更简单直接也足够稳定。下面是我在smart_switch.c中写的舵机控制函数#include stdio.h #include unistd.h #include ohos_init.h #include cmsis_os2.h #include iot_gpio.h // 定义舵机信号线连接的GPIO引脚根据你的实际电路连接修改 #define SERVO_PIN 9 // 模拟PWM控制舵机转到指定角度 // 参数angle - 目标角度0-180 void Servo_SetAngle(int angle) { // 将角度转换为高电平时间微秒范围 500~2500 us // 这个公式需要根据你的舵机实际参数微调 int pulseWidth 500 (angle * 2000 / 180); // 输出一个周期为20ms的PWM波中的高电平部分 IoTGpioSetOutputVal(SERVO_PIN, 1); // 输出高电平 usleep(pulseWidth); // 维持高电平脉宽 // 输出剩余的低电平部分以完成20ms周期 IoTGpioSetOutputVal(SERVO_PIN, 0); // 输出低电平 usleep(20000 - pulseWidth); // 维持低电平 } // 舵机初始化函数 void Servo_Init(void) { // 初始化GPIO IoTGpioInit(SERVO_PIN); // 设置GPIO为输出模式 IoTGpioSetDir(SERVO_PIN, IOT_GPIO_DIR_OUT); printf(Servo GPIO init OK.\r\n); }代码逻辑解读Servo_Init函数很简单就是设置我们用来模拟PWM的GPIO引脚为输出模式。Servo_SetAngle是核心。它根据传入的角度计算对应的脉宽时间。然后让GPIO输出一个高电平并保持pulseWidth微秒接着输出低电平补足20ms周期。注意为了让舵机保持角度你需要周期性地比如每20ms调用这个函数。在实际控制中可以放在一个循环里。提示usleep是微秒级延时函数这里用它来精确控制高低电平的时间。不同舵机的脉宽范围可能略有差异如果发现角度不准可以调整500和2500这两个基准值。3.2 Wi-Fi联网与网络通信要让手机控制板子必须能上网。鸿蒙提供了便捷的Wi-Fi连接接口。#include wifi_device.h // Wi-Fi连接配置改成你家的路由信息 #define WIFI_SSID Your_WiFi_SSID #define WIFI_PASSWORD Your_WiFi_Password static void Wifi_Connect(void) { WifiDeviceConfig config {0}; int netId -1; // 拷贝SSID和密码到配置结构体 strcpy(config.ssid, WIFI_SSID); strcpy(config.preSharedKey, WIFI_PASSWORD); config.securityType WIFI_SEC_TYPE_PSK; // 常用的WPA2-PSK加密方式 // 连接到指定的Wi-Fi热点 netId ConnectToDevice(config); if (netId 0) { printf(Connect to WiFi %s successfully!\r\n, WIFI_SSID); } else { printf(Connect to WiFi failed!\r\n); } }连接上Wi-Fi后Hi3861就获得了局域网IP。接下来需要实现网络通信来接收手机指令。这里有几个选择TCP/UDP Socket自己写一个简单的Socket服务器手机作为客户端连接并发送指令。最灵活但需要自己处理通信协议。MQTT协议物联网最常用的协议之一。Hi3861作为MQTT客户端连接到公共或自建的MQTT服务器如EMQX手机也通过MQTT发布控制消息。这是更标准、更专业的做法。鸿蒙分布式能力如果手机也是鸿蒙系统可以使用鸿蒙的分布式软总线能力实现设备间自发现、自组网开发更简单但限制较多。由于篇幅这里以最简单的TCP Socket为例。我们在代码里创建一个TCP服务器监听某个端口比如8888手机App通过网络调试助手或自己写的App连接这个IP和端口发送“ON”或“OFF”字符串。3.3 整合主逻辑接收指令驱动舵机最后我们把Wi-Fi连接、网络监听和舵机控制串起来形成完整的主程序逻辑。// 这是一个简化的主任务函数展示了核心逻辑 void SmartSwitch_Task(void *arg) { (void)arg; // 1. 初始化硬件 Servo_Init(); // 2. 连接Wi-Fi Wifi_Connect(); // 3. 创建TCP Socket开始监听此处省略具体Socket代码 // int server_fd socket(...); bind(...); listen(...); printf(Smart Switch is ready, waiting for commands...\r\n); while (1) { // 4. 等待并接受客户端连接省略 // int client_fd accept(...); // 5. 循环接收客户端发来的数据 char cmd_buf[10] {0}; // read(client_fd, cmd_buf, sizeof(cmd_buf)); // 6. 解析指令并控制舵机 if (strcmp(cmd_buf, ON) 0) { printf(Received ON command.\r\n); // 让舵机转动到“开”的位置例如120度 for(int i0; i50; i) { // 发送一段时间PWM以稳定位置 Servo_SetAngle(120); usleep(20000); } } else if (strcmp(cmd_buf, OFF) 0) { printf(Received OFF command.\r\n); // 让舵机转动到“关”的位置例如60度 for(int i0; i50; i) { Servo_SetAngle(60); usleep(20000); } } // 7. 处理完毕后可以关闭连接或继续等待下一条指令 // close(client_fd); osDelay(10); // 让出CPU鸿蒙系统的延时函数 } } // 应用入口鸿蒙标准写法 void SmartSwitch_Main(void) { printf(Smart Switch Demo Start\r\n); osThreadAttr_t attr; attr.name SmartSwitchTask; attr.stack_size 4096; attr.priority osPriorityNormal; if (osThreadNew(SmartSwitch_Task, NULL, attr) NULL) { printf(Failed to create SmartSwitchTask!\r\n); } } // 使用鸿蒙的启动宏将主函数注册到系统 SYS_RUN(SmartSwitch_Main);4. 调试、组装与实测心得代码写完编译烧录后就是激动人心的调试阶段了。硬件组装将打好的PCB板、Hi3861核心板、舵机按照电路图焊接或连接好。可以用热熔胶或3D打印一个外壳把舵机的“手臂”改装成能按压开关的形状。上电测试先不接舵机用万用表或示波器测量驱动三极管输出端的波形看看GPIO模拟的PWM波形是否正确周期约20ms脉宽随角度变化。连接舵机确认波形正常后接上舵机。你会听到舵机转动的声音。分别发送ON和OFF指令观察舵机是否转动到预设的两个角度并能否成功按压开关。网络调试可以先在电脑上用网络调试工具如NetAssist连接Hi3861的IP和端口手动发送指令测试比用手机App更方便。我踩过的几个坑电源干扰舵机在转动瞬间电流很大可能导致Hi3861复位。一定要确保电源5V适配器功率足够建议2A以上并且在舵机电源端并联一个100-470uF的电解电容来缓冲电流冲击。PWM精度软件模拟PWM在系统繁忙时可能被中断影响精度。如果发现舵机有抖动或角度不准可以尝试提高控制任务的优先级或者使用硬件PWM需要仔细配置Hi3861的PWM外设。机械结构舵机臂和开关的接触点需要反复调整确保既能按下去又不会卡住。这是个精细活。做完这些你的智能开关就能工作了。把它固定在传统开关旁边通过手机就能远程控制改造老房子特别实用。这个项目虽然小但涵盖了物联网开发的完整链条硬件设计立创EDA、嵌入式编程鸿蒙Hi3861、执行器控制舵机PWM和网络通信。希望你能在这个过程中学到东西并享受创造的乐趣。