# 智慧儿童管家 ## 项目简介 对于家里的孩子,还要上班的父母总是被不能安安心心,随着物联网的发展和华为生态链的普及,一款基于鸿蒙操作系统的智慧儿童管家机器人呼之欲出。 孩子一方面需要父母抽出时间来陪伴,另一方面需要父母费劲心思来监管,儿童的心智尚不成熟,抗诱惑能力弱,难以高度自律和辨别是非,另一方面,孩子也容易被好奇心驱使,而意外造成一些安全事故,这些都需要一款综合性的机器人来实现对儿童的陪伴和管理,这也是这款儿童管家设计的初衷。 目前的管家功能尚不完善,希望后续的战友可以共同学习进步,完善这个必将走进千家万户的产品。 ## 功能简介 目前智慧儿童管家实现了下面几点功能: 1. 基本的移动控制功能:如果不能移动的管家,那么一定会受到很多限制吧,所以管家首先需要具备移动功能,这样为后续的图像和语言等功能准备平台条件; 2. 摄像头图像传输功能:通过视频流的实时传输,可以实现远程对孩子的监护和陪伴,也让使用者放心; 3. 语言交流功能:如果管家不能对外界做出反应,那么也一定会显得很鸡肋吧,不同层次的语言交流功能将是智慧管家之所以智慧的管家所在; 4. 其他扩展功能:后续方面,如果能接入家中的智能设备,作为家中的一个智能终端,也未尝不是一件让人快乐的事情。 ## 功能实现路径 ### 1.移动控制-3861 ![image](https://note.youdao.com/yws/res/65/WEBRESOURCEf7678ac12597a10e39bb59cd533fa7f4) 移动控制基于3861进行,基本思路是通过对pwm波形的控制,实现对电机的控制,进而实现对小车的移动,为了通信方面的方便,我们采用udp协议进行通信,通过发送对于格式的数据,实现远程对小车的控制。 3861提供了充分的接口对于调用GPIO和引脚复用,以及wifi等模块的驱动示例。可以通过小熊派开源社区的一些资料进行学习。 ### 2.摄像头功能 摄像头部分基于3516进行开发,复刻参考了开源的sig组中的智能猫眼,具体实现代码教程见: https://gitee.com/romachen/knowledge_demo_smart_home/blob/master/dev/docs/smart_door_viewer_3516/README.md ### 3.语音模块 语言模块目前基于esp-eye(方案二:LD3320模组),通过识别提前导入的关键词话语,通过udp或者串口传输信号(输出GPIO电平高低),实现基本的控制,具体操作路径见docs ### 4.智能家居功能 此功能还尚未开发,技术路径可以通过小熊派(3861)的数字管家进行,配合鸿蒙手机操作系统,实现对台灯,空调等设备的控制,亦可以接入语音模块 ## 文件说明 示例文件夹下包含camer_out,children,move_control三个部分,具体的操作手册将在docs里面说明,另外,还附上了相关的烧录文件,方面快速体验功能。 B站视频链接:https://www.bilibili.com/video/BV1qm4y1R7oC?spm_id_from=333.999.0.0 ## 写在最后 本次项目开发历时三个月左右,前期在环境配置上面用了不少功夫,参考了许多开源社区的教程,欢迎与各位交流讨论,有任何问题,欢迎邮箱联系:158902477@qq.com 最后,希望鸿蒙和华为能够长足的发展下去,成为国家的脊梁,也能真正给人民的生活带来便利,提高国家的综合影响力和实力。 下面进行具体操作流程的展示 --- ## 小车移动控制 3861 ### 3861环境配置 方法一:借助小熊派开源社区提供的虚拟机镜像,直接进行开发(最简单) 链接:https://gitee.com/romachen/bearpi-hm_nano/blob/master/applications/BearPi/BearPi-HM_Nano/docs/quick-start/BearPi-HM_Nano%E5%8D%81%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B.md 方法二:基于ubuntu进行环境搭建, 参考链接:https://gitee.com/romachen/docs/blob/master/zh-cn/device-dev/quick-start/Readme-CN.md ### app开发和编译构建 #### udp开发示例介绍 ## socket() ```c sock_fd = socket(AF_INET, SOCK_STREAM, 0)) //AF_INT:ipv4, SOCK_STREAM:tcp协议 ``` **描述:** 在网络编程中所需要进行的第一件事情就是创建一个socket,无论是客户端还是服务器端,都需要创建一个socket,该函数返回socket文件描述符,类似于文件描述符。socket是一个结构体,被创建在内核中。 ## sendto() ```c int sendto ( socket s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ; ``` **描述:** sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket。参数msg指向欲连线的数据内容,参数flags 一般设0, ## 软件设计 **主要代码分析** 完成Wifi热点的连接需要以下几步 1. 通过 `socket` 接口创建一个socket,`AF_INT`表示ipv4,`SOCK_STREAM`表示使用tcp协议 2. 调用 `sendto` 接口发送数据到服务端。 3. 调用 `recvfrom` 接口接收服务端发来的数据 ```c static void UDPClientTask(void) { /* 服务器的地址信息 */ struct sockaddr_in send_addr; char recvBuf[512]; /* 连接Wifi */ WifiConnect("TP-LINK_65A8","0987654321"); /* 创建socket */ if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("create socket failed!\r\n"); exit(1); } /* 初始化预连接的服务端地址 */ send_addr.sin_family = AF_INET; send_addr.sin_port = htons(_PROT_); send_addr.sin_addr.s_addr = inet_addr("192.168.0.175"); while (1) { bzero(recvBuf,sizeof(recvBuf)); /* 发送数据到服务端 */ sendto(sock_fd, send_data, strlen(send_data), 0, (struct sockaddr * )&send_addr, addr_length); /* 线程休眠一段时间 */ sleep(10); /* 接收服务端返回的字符串*/ recvfrom(sock_fd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr * )&send_addr, &addr_length); printf("%s:%d=>%s\n", inet_ntoa(send_addr.sin_addr), ntohs(send_addr.sin_port), recvBuf); } /* 关闭这个 socket */ closesocket(sock_fd); } ``` ## 编译调试 ### 修改 BUILD.gn 文件 修改 `applications\BearPi\BearPi-HM_Nano\sample` 路径下 BUILD.gn 文件,指定 `udp_client` 参与编译。 ```r #"D1_iot_wifi_sta:wifi_sta", #"D2_iot_wifi_sta_connect:wifi_sta_connect", "D3_iot_udp_client:udp_client", #"D4_iot_tcp_server:tcp_server", #"D5_iot_mqtt:iot_mqtt", #"D6_iot_cloud_oc:oc_mqtt", #"D7_iot_cloud_onenet:onenet_mqtt", ``` ### 运行结果 使用 Socket tool 创建UDP服务端用于测试。 示例代码编译烧录代码后,按下开发板的RESET按键,在数据发送窗口输入要发送的数据,点击发送后开发板会回复固定消息,且开发板收到消息后会通过日志打印出来。 ``` 192.168.0.175:8888=>Hello! BearPi-HM_nano UDP Client! ``` #### 小车运动控制 在路径bearpi-hm_nano\applications\BearPi\BearPi-HM_Nano\sample下面新建一个项目文件夹,名为move_control,将对于文件夹中文件全部放入 ![image.png](https://note.youdao.com/yws/res/132/WEBRESOURCE7a002abc0400fb3be13d9f965a9b3565) 可以看到,对应文件中,move_control.c中调用了move_control.h,并在其中定义了小车的pwm调用函数,和对udp协议过来的数据的反应 ![image.png](https://note.youdao.com/yws/res/138/WEBRESOURCE724d2af4aa5c89bfd9684e6f3fc7978d) 另外在udp_test.c和sta_entry中设定了对应的通信程序,你可以在sta_entry中设置自己的WiFi和密码,以便连接自己的设备: ![image.png](https://note.youdao.com/yws/res/144/WEBRESOURCE81d3c4547160667b8a39dcfbded77026) 如果你将修改对于的文件样式框架,请记得修改build.gn中对应的文件以来 另外在加入源代码之后,记得修改bearpi-hm_nano\applications\BearPi\BearPi-HM_Nano\sample中的Build.gn文件,注释掉对应app代码(该文件位于\陈欣宇_智慧儿童管家\dev\teamx\smart_children_housekeeper\code) ![image.png](https://note.youdao.com/yws/res/155/WEBRESOURCE2d2af351fc928fec4929d9e631725f24) ## 摄像头图传 3516 项目在进行过程中,借助了3516中sig的智能猫眼开源实例,地址链接: https://gitee.com/romachen/knowledge_demo_smart_home/blob/master/dev/docs/smart_door_viewer_3516/README.md https://blog.csdn.net/qq_54472191/article/details/122274793 ## 语言识别控制 方案一:ESP-EYE 参考链接,完成对应文件的配置 https://www.espressif.com/zh-hans/products/devkits/esp-eye/overview 方案二:离线语音模块 具体可参见对应模块的开发文档,只要实现对应的gpio变化控制即可。 --- ## 最终效果 ![image](https://note.youdao.com/yws/res/162/WEBRESOURCE6a008b0cb6e378f8c22f88da6c60ff5b)