基于Sipeed M1s Dock 的简易网络相机
Sipeed M1s Dock 是以博流BL808 MCU为主控所制作的 AIOT 核心板。项目主要分为两部分:第一部分在开发板上实现相机驱动,拍摄图片,并通过网络发送。第二部分上位机实现接收并保存图片,并将图片合成为一个视频。
标签
嵌入式系统
测试
网络与通信
视频
都市木头
更新2023-03-28
408

内容介绍

 

基于Sipeed M1s Dock 的简易网络相机

​​Fsk1MkRgmuNsRTdtRiJiWlQ7SdhR

一、项目描述

        本项目是在2023寒假一起练平台(3)基于Sipeed M1s Dock上,实现一个简易网络相机的设计制作。

FuzZg_OlIrDakZXhhPP3kLvrnpTL

(一)项目介绍

        之所以简易,是因为本项目在没有增加外设的情况下,只使用Sipeed M1s Dock平台的自身资源,且没有专门设计用户界面,实现以下基本功能

  • 完成相机驱动,定时拍摄图片,并将图片通过网络传到电脑或服务器,实现长时间拍摄
  • 通过电脑端编程将图片合成为一个视频
(二)设计思路
        编写开发板固件,并通过U盘或串口烧录软件把固件烧录到开发板上,在开发板上实现相机驱动,生成图片串流,并通过WIFI网络发送;编写上位机软件,实现接收并保存来自与M1s Dock开发板相同WIFI网络的图片串流,并将图片合成为一个视频。
FhIXrQMYADoXqXGMr3Cnf_5b8hq9

        主要分为两部分:

第一部分主要是编写开发板上的固件,实现相机驱动,拍摄图片,并通过网络发送(M1s Dock 只支持 2.4G 无线WIFI网络)。开发板上主要通过C语言编程完成固件制作,并进行编译和烧录。

Ftk0D1JU-BwM1sGjqLcQ7bl1gHqw

第二部分主要通过电脑端编程,上位机实现接收并保存来自与M1s Dock开发板相同网络的图片,并将图片合成为一个视频。电脑端使用python语言编程,采用opencv模块实现相应图片接收存储和视频合成功能。

Flo8ctD8jvCjRVgI8Enj_G6fy7Qi
二、硬件简介

 

        Sipeed M1s Dock 是基于 Sipeed M1s 模组来设计的一款核心板,以博流 808 MCU为主控所制作的 AIOT 核心板,引出了 MIPI CSI、SPI LCD 等 FPC 接口,免去接线难的烦恼。

​​Fj80W6tBoiscIPryDUukIT1VdB3A

        开发板板载 USB 转 UART 调试器,可实现一键点击烧录,无需按实体按键,选配有1.69 寸 240x280 电容触摸屏,并配有MIPI接口的200W 像素摄像头,支持 2.4G WIFI / BT / BLE,并板载 1 个模拟麦克风、1 个 LED、1 个 TF 卡座。其引脚图如下:

​​FrUPHgxmjTe8_PABHMZ4TaC_ryUG

 

三、具体实现过程
    实现过程如下图所示,区分开发板固件实现和电脑端上位机编程。
FnESilzc9GAxUWvJTm_BMMVh0FoO
(一)开发板固件实现
1、固件升级

        U 盘烧录的方法来给快速地烧录 M1s Dock 上 bl808 的 C906 核心所运行的程序。当板子出现固件异常或者需要将板子的固件全部升级时,我们需要通过串口烧录这种方法来重新烧录 M1s Dock。刚好官方提供了最新的固件firmware_20230227.bin​和部分开源Demo,使用 TypeC 数据线将电脑与板子的 UART 口连接起来,此时电脑上会出现两个串口。

        使用博流官方烧录工具 Bouffalo Lab Dev Cube ,启动图形化界面烧录软件 BLDevCube​ 后选择 bl808。

Fr7lmBonfWwxcErWlkwdi5kGA_AfFtowEwgXfVGwlZcWFNziiXvhaEq7

        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 端应答。

(二)电脑端上位机编程
1、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​ 来使用,显示画面如下,可见其实已经实现了摄像头功能。

FthG1oOo9NmYf7GgNcit4XI-7EXO

3、编写图片录制和视频合成代码段

        使用VSCode工具,采用python语言和opencv模块实现相应图片接收存储和视频合成功能。

        由于没有开发用户界面,所以使用时是在VSCode终端上执行并观察结果的。

FoMpl0jho-fva98l58GVelbB7YIS

 

四、主要代码片段及说明

       图片录制代码段,参考了群友的代码,首先使用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的入门好工具,后续可以深入学习研究一下。

附件下载

camera_MyNetCam.bin
Image_rec.zip
Video_output.zip

团队介绍

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号