内容介绍
一、项目描述本项目是在2023寒假一起练平台(3)基于Sipeed M1s Dock上,实现一个简易网络相机的设计制作。
之所以简易,是因为本项目在没有增加外设的情况下,只使用Sipeed M1s Dock平台的自身资源,且没有专门设计用户界面,实现以下基本功能:
- 完成相机驱动,定时拍摄图片,并将图片通过网络传到电脑或服务器,实现长时间拍摄
- 通过电脑端编程将图片合成为一个视频
主要分为两部分:
第一部分主要是编写开发板上的固件,实现相机驱动,拍摄图片,并通过网络发送(M1s Dock 只支持 2.4G 无线WIFI网络)。开发板上主要通过C语言编程完成固件制作,并进行编译和烧录。
第二部分主要通过电脑端编程,上位机实现接收并保存来自与M1s Dock开发板相同网络的图片,并将图片合成为一个视频。电脑端使用python语言编程,采用opencv模块实现相应图片接收存储和视频合成功能。
Sipeed M1s Dock 是基于 Sipeed M1s 模组来设计的一款核心板,以博流 808 MCU为主控所制作的 AIOT 核心板,引出了 MIPI CSI、SPI LCD 等 FPC 接口,免去接线难的烦恼。
开发板板载 USB 转 UART 调试器,可实现一键点击烧录,无需按实体按键,选配有1.69 寸 240x280 电容触摸屏,并配有MIPI接口的200W 像素摄像头,支持 2.4G WIFI / BT / BLE,并板载 1 个模拟麦克风、1 个 LED、1 个 TF 卡座。其引脚图如下:
三、具体实现过程
U 盘烧录的方法来给快速地烧录 M1s Dock 上 bl808 的 C906 核心所运行的程序。当板子出现固件异常或者需要将板子的固件全部升级时,我们需要通过串口烧录这种方法来重新烧录 M1s Dock。刚好官方提供了最新的固件firmware_20230227.bin和部分开源Demo,使用 TypeC 数据线将电脑与板子的 UART 口连接起来,此时电脑上会出现两个串口。
使用博流官方烧录工具 Bouffalo Lab Dev Cube ,启动图形化界面烧录软件 BLDevCube 后选择 bl808。
IOT 页面选择分区表文件后,主要设置 boot2, firmware, d0fw 三项。boot2 是固定的,位于 BLDevCube\chips\bl808\builtin_imgs\boot2_isp_bl808_xxxx_xxx 目录下,就是在解压的烧录程序文件夹的子目录里面,要选择名称带有 debug 的文件;firmware 是 E907 核心运行的固件 ;d0fw是 C906 核心运行的固件,前面的 U 盘烧录里面的固件就是给这个核心烧录的。E907 的固件文件和 C906 的固件文件均可以通过 M1s_dock example 来编译得到。
BL702 芯片在这里担任着 USB 转双串口芯片功能。因此有时候串口异常的话,可以上电前按住 BOOT 按键来给 BL702 重新烧录一下 USB 转双串口的固件。
首次烧录 firmware 和 boot2 都需要烧录进去,之后就可以按需烧录而不用全部勾选。
正确的选择固件后,在窗口右侧点击一下 Refresh 来刷新串口,正常情况有两个串口号相邻的串口可供选择。在本烧录应用中,对 M1s Dock 操作均需要通过串口号较大的串口,而不是小号串口。
按住板子上的 BOOT 键和 RST 键, 然后先松开 RST 键再松开 BOOT 键来使板子进入串口烧录模式。
烧录完之后,可以采用更方便的U盘烧录来给 C906 核心烧录固件。
2、编译环境搭建至少在这个项目中根本不要使用博流的官方工具,主要是搭建Linux环境,并安装编译所需要的相关软件(git make tree等), 获取例程仓库和SDK 仓库,并在 SDK 仓库文件夹下,获取编译工具链并配置路径,均在命令行下完成。这种方式简化了博流官方的编译环境搭建,开源的项目模板可以初步体验基本的功能。最简单的方式就是按照Sipeed官方文档搞就行了。
3、代码修改
在开发板上实现的功能主要是修改C906 核心固件就可以完成,我这里按照上手指南直接修改M1s_BL808_example/c906_app/camera_streaming_through_wifi 中的 main.c 文件里面的 m1s_xram_wifi_connect() 和 m1s_xram_wifi_upload_stream() 函数,主要是修改网络名为要连接到的 PC 已经连接上的网络,并且将 12345678 更改为目标网络的连接密码。并将 10.42.0.1 替换成 PC 所在目标网络中的 IP 地址。
4、固件编译和烧录修改代码且保存后,编译例程。将编译得到的 d0fw.bin 固件通过 U 盘烧录的方式来快速的烧入到 M1s Dock 里面,打开大号串口,按下板子上面的复位键。在板子成功连接到网络后它会在大号串口打印出自己的 IP 信息,并且 Socket connect 表示正在等待 PC 端应答。
(二)电脑端上位机编程PC 与M1s Dock板卡需要在同一网络环境中(只 支持 2.4G 无线网络)。PC 软件环境需要安装python3, OpenCV,NumPy 等,我这里是在windows环境下采用VsCode进行编程。
2、WIFI 串流摄像头 DEMO
指南中的例程给出了一个pythonDEMO文件,可以实现接收 M1s dock 的流并且调用 opencv 来显示画面,具体在M1s_BL808_example/c906_app/camera_streaming_through_wifi 中的python文件。
使用这个Demo,主要目的是快速验证开发板固件是否功能正常。直接执行命令 python3 main.py 来使用,显示画面如下,可见其实已经实现了摄像头功能。
3、编写图片录制和视频合成代码段
使用VSCode工具,采用python语言和opencv模块实现相应图片接收存储和视频合成功能。
由于没有开发用户界面,所以使用时是在VSCode终端上执行并观察结果的。
四、主要代码片段及说明
图片录制代码段,参考了群友的代码,首先使用socket模块连接与开发板共同的网络并监听网络上的数据,当接收到来自开发板的图片数据后,按序命名并保存在image文件夹中,图片为.jpg格式。
import socket
import os
server = socket.socket()
server.bind(("", 8888))
server.listen()
cnt = 10000
while True:
client, source = server.accept()
while True:
len_jpg = client.recv(4)
if not len_jpg:
break
length = int.from_bytes(len_jpg, byteorder='little', signed=True)
print(f"receiving length:{length}")
client.send(b's')
if length > 90000:
client.close()
break
data = b''
while len(data) < length:
chunk = client.recv(length - len(data))
if not chunk:
break
data += chunk
image_folder = "image"
if not os.path.exists(image_folder):
os.makedirs(out_folder)
image_file = os.path.join(image_folder, f'image{cnt}.jpg')
while os.path.exists(image_file):
cnt += 1
image_file = os.path.join(image_folder, f'image{cnt}.jpg')
with open(image_file, "wb") as f :
f.write(data)
cnt += 1
client.close()
server.close()
视频合成代码段,降序读取image中的图片文件,并通过opencv模块VideoWriter功能合成为NetCam.mp4视频文件,其大小为800X600,帧数为20帧。
import cv2
import os
image_path = 'image/'
images = [os.path.join(image_path, f) for f in os.listdir(image_path) if f.endswith('.jpg')]
images.sort()
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video_writer = cv2.VideoWriter('NetCam.mp4', fourcc, 20, (800,600))
print("start record video!")
for image in images:
print(image)
frame = cv2.imread(image)
video_writer.write(frame)
video_writer.release()
print("NetCam.mp4 recv success!")
print("Bye!")
五、未来的计划
对M1s Dock只是初步上手体验,即使是这个网络相机,还有很多问题没有解决,很多知识点没有理解掌握,尤其是网络和图像处理编程还需深入了解学习;同时,M1s Dock模块功能强大,尤其是具有通用硬件加速器 —— BLAI-100 用于视频/音频检测/识别,支持原生 SDK 的 BLAI 加速推理引擎,支持通用 TinyMaix 推理引擎,支持AI 模型下载 ,支持 人脸检测,识别,姿态检测,手势检测 等,这些功能都还没有实现,是学习机器AI的入门好工具,后续可以深入学习研究一下。