1

1. 嵌入式产品概述

最近做智能语音交互产品,顺便调研、学习了嵌入式产品及相关的知识。

原来对嵌入式产品了解不多,总觉得不好入手。通过学习才知道,嵌入式产品无处不在,且价格低廉(几元到几十元)、功能强大,开发也不难。

目前主流的嵌入式芯片,主要指单片机SOC(System on a Chip),即系统级芯片或片上系统,SoC中包含一个或多个处理器、存储器、模拟电路模块、数模混合信号模块以及片上可编程逻辑。单片机芯片一般很小,一般也就1x1厘米左右,价格一般几元到几美元,单一芯片集成了CPU、存储等,可以将设计好的程序烧录到存储中,开机就可以运行。

一般嵌入式产品,由嵌入式芯片配上相关的模块组成一个完整的电路版,是产品的核心。比如智能音箱产品,就是由电路板(嵌入芯片、WIFI、蓝牙、功放、模数转换、数模转换、PIO(可编程输入输出))、远场麦克风、喇叭、提示灯、按钮、外壳等组成。所有的交互都是嵌入芯片中的程序控制的,如声音采集,一般是模数采集芯片进行采样为数字值,存于指定的区域,再由程序进行读取。开关灯控制就是设置对应PIO的值(开/关),环形灯或渐变灯效果,就是采用PMW(脉冲宽度调制)将数字值输出为模拟值给到灯就行。按钮对应一个PIO,也会在嵌入芯片中产生中断,然后由中断处理程序进行相应的处理。

嵌入式产品的硬件开发涉及的范围广,更专业一些,如ID设计(工业设计 - Industrial Design,包括场景交互、造型、材质、表面处理)、MD设计(结构设计 - Mechanic Design,拆件处理、结构合理性、元器件匹配度、防护设计)、模具加工等。

嵌入式产品的软件开发相对就简单一些,目前一般是采用C或C++语言,也有一些支持Python、Rust或图形组件方式开发。C或C++开发一般集成开发环境用uVision,开发时,要选择嵌入芯片型号,开发时,不用接入实际设备,可以模拟执行,调试。实际接入硬件调试时,一般采用USB线连接硬件与电脑(通过USB-UART电路,将USB模拟为一个串口),电脑会自动识别该硬件为串口设备如COM3,再采用串口调试工具如Windows sscom、Mac minicom,打开相应的端口就可以查看到调试信息(一般在代码中采用prinft函数输出,内容会重定向到串口输出中,从而方便调试),也可以采用在线串口调试硬件调试。uVision支持8051系列、ARM系列等。

常用的单片机有8051系列,ARM系列。

  • MCS-51单片机
    是美国INTEL公司于1980年推出的产品,8051是早期的最典型的代表作,由于MCS-51单片机影响极深远,许多公司都推出了兼容系列单片机,就是说MCS-51内核实际上已经成为一个8位单片机的标准。国内比较有名的有STC公司(宏晶科技)的单片机产品,如支持语音识别的模组就采用STC11L56XE单片机、IC Route公司的LD3320A语音识别芯片、SYN6288语音合成芯片。
    image.png
  • ARM
    英国ARM公司是全球领先的半导体知识产权(IP - Intellectual Property)提供商,全世界超过95%的智能手机和平板电脑都采用ARM架构。ARM公司不生产芯片,只做芯片的设计,然后将设计授权给其它公司,收取授权费用,其它公司据此或在此基础上定制修改进行芯片生产、销售。

ARM v7架构后的处理器命名,冠以Contex的代称,如Contex-A系列、
Contex-R系列
、Contex-M系列。

  • Contex-A系列
    面向高端的应用处理器,一般可安装操作系统,如嵌入式Linux, Android, Windows。
  • Contex-R系列
    主要面向实时系统,适用于需要快速处理的系统,如汽车油门、刹车控制等。
  • Contex-M系列
    适用于要求性价比高、能耗低的产品,一般没有操作系统,也可安装free rtos或ucos操作系统。

常用的开发芯片为Contex-A/M系列,如树莓派采用的Context A72内核,意法半导体的ARM芯片STM32F103C8T6可采用裸机系统或安装free rtos。

ARM芯片中,意法半导体STM的ARM芯片使用较多,如STM32F103C8T6,其命名方式为STM32代表32位芯片,F103代表增强型,C代表引脚数为48,8代表Flash大小为64K,T代表封装为LQFP方式,6代表工作温度范围为-40 ~ +85 摄氏度。
image.png

STM芯片种类很多,可以下载STMCUFinder进行选择,如选择支持摄像头接口的芯片,就可以列出许多,选择STM32F407ZG,则其参数定义及描述如下所示:
image.png

2. 本次开发过程概述

本次开发基于机芯智能的开发板XR-51A_EVB,基于ARM Contex-M4F,支持WIFI、声音、摄像头等,该开发板特性为:
◼ IEEE 802.11b/g/n, 1x1 SISO 2.4GHz
◼ 内置 ARM Cortex-M4F 的 32 位微型 MCU,主频高达 384MHZ
◼ 内置 416KB 的 SRAM,160KB 的 ROM 和 4M 的 PSRAM
◼ 内置 1024 bits 的 efuse
◼ 支持 DVP 接口摄像头,最大支持 1920*1088 分辨率,板载闪光灯
◼ 支持 UART/GPIO/PWM/CSI/MIC/Line-in/Speaker 接口
◼ 支持 AES/DES/3DES/SHA/MD5/CRC 加密引擎
◼ 支持 STA/AP/ STA+AP 工作模式
◼ 支持 Smart Config/AirKiss(微信)一键配网
◼ 支持串口本地升级和远程固件升级(FOTA)功能
◼ 支持二次开发,集成了 Windows、Linux 开发环境
◼ 集成音频子系统(Audio Subsystem),包括 1 个带有左右声道语音输入的数字麦克风控制器,1 个 24 位音频数模(DAC)通道,支持 8KHz至 192KHz 的采样率,1 个用于麦克风输入的 24 位音频模数(ADC)通道,支持 8KHz 至 48KHz 的采样率,1 个用于线路输入的 24 位音频数字(ADC)通道,支持 8KHz 至 48KHz 的采样率。
◼ 集成视频子系统(Video Subsystem),支持 JPEG、YUV 编码模式,在离线编码模式下支持 nv12 输入格式,支持可配置的图片分辨率,最低图片分辨率:32x32,最大图片分辨率:1920x1088

image.png

SRAM是CPU运行的存储器,用于存储指令或数据,断电后信息丢失,ROM(类似于U盘)一般存储编译后烧录的代码或数据,断电不会丢失,PSRAM一般用于缓存,如图像、声音缓存等,断电后会丢失。

3. 试验过程

3.1 编译示例代码

软件开发的第一步是运行Hello world示例程序,嵌入式开发也不例外,按照开发手册,一步一步来,首先下载源代码

cd xr-50a        # 建立开发根目录
wget https://github.com/XradioTech/xradio-skylark-sdk    # 下载开发板SDK
wget https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q2-update/+download/gcc-arm-none-eabi-4_9-2015q2-20150609-linux.tar.bz2 # 下载arm交叉编译工具
tar -xvf gcc-arm-none-eabi-4_9-2015q2-20150609-linux.tar.bz2
cd xradio-skylark-sdk     # 进入sdk根目录
vim gcc.mk                 # 修改全局gcc编译参数,将arm交叉编译环境加入

# -----------------------------------------------------------------# cross compiler
# -----------------------------------------------------------------CC_DIR := /home/xr-50a/gcc-arm-none-eabi-4_9-2015q2/bin
CC_PREFIX := $(CC_DIR)/arm-none-eabi-

cd project/demo/hello_demo/gcc     # 进入hello工程下的编译目录gcc
make config                # 配置开发板类型(XR872, 40M)
make lib                 # 编译库文件(包括声音驱动、图像显示、网络等,编译成相应模块的库文件.so)
                        # 具体模块如atcmd,audio,cjson,console,driver,efpg,fs/fatfs,image,jpeg,kernel,libc,net,ota,pm,rom,smartlink,sys,util,xz
make                    # 编译hello工程,形成执行文件.axf
make image                 # 将执行文件打包成烧录镜像文件.bin

开发板通过Type C连线连接到Windows电脑,运行烧录程序PhoenixMC.exe,选择上述镜像文件,烧录,电脑运行sscom串口通讯软件,选择端口一般是Com3,打开端口,按开发板reset按键重启,开发板烧录程序自动运行,电脑端sscom中即可显示出相应的调试信息。

image.png

开发编译环境可以是Windows,也可以是Linux,操作方法基本一样。Windows下是安装Cygwin+GCC,安装完成后,在cygwin类Linux环境下操作,操作的命令都是一样的。

3.2 获取物联网接入代码

要开发物联网应用,有很多物联网平台可以接入,也可以选择开源的物联网平台,商用的平台如腾讯连连IoT Explorer、阿里云IoT、中国移动OneNET、华为云IoT、机智云等,商用平台对小批量产品接入一般均免费,如小于10台。

本开发板自带的镜像可以接入腾讯连连,按reset按键三次,即可进入配网模式,用手机扫描一下厂家提供的二维码,即可打开微信小程序,进行联网(要求手机连接WIFI),联网成功后,小程序中即可查看到设备情况,可以开灯、关灯,也可与开发板直接对话,如“小智小智,今天的天气怎么样?”,“小智小智,播放歌曲”,“小智小智,打开台灯”等。

经过比较,还是机智云的物联网接入比较简单一些,

物联网接入一般流程:注册开发者帐号、定义物联网产品、数据点、虚拟设备测试、代码移植、实际设备调试、上线。

  • 定义物联网产品
    即定义本物联网产品的基本信息,包括名称、类型、通讯方式、ProductKey、ProductSecret等,直接在控制面板进行定义即可。
  • 数据点
    即设备产品的功能的抽象,采用Json格式表达,用于描述产品功能及其参数。比如智能灯,我们可以定义一个OnOff的布尔型数据,用于控制灯的开关,另外定义一个brightness的整数型数据,范围0-100,用于定义灯的亮度。创建数据点后,设备与云端通讯的数据格式即可确定,设备、机智云可以相互识别设备与机智云互联互通的数据。
  • 虚拟设备测试
    产品定义及数据点确定后,我们可以认为系统已经为我们产生了一个虚拟的物联网设备了,该设备按我们的要求进行定义,可以进行虚拟测试了。系统提供了控制台直接测试及手机APP控制测试,在测试界面或手机APP上,即可看到我们的设备了,也可以方便地对设备进行控制,发出控制指令后,虚拟设备的状态会发生相应的改变,这与我们最终完成的情况是类似的,通过这个方式,可以对我们的产品有个直接的了解、认识。控制台操作界面如下:
    image.png

手机APP控制界面如下:
image.png

  • 代码移植
    接下来就要实现我们的代码了,机智云可以自动生成MCU SDK,即根据上述定义的产品属性、数据点自动生成物联网接入代码,将这个代码根据嵌入设备的代码进行相应的修改编译即可。

    cd xr-50a/xradio-skylark-sdk/project/demo     # 进入demo目录
    cp -r hello_demo gz-iot                     # 从hello_demo拷贝为物联网工程目录gz-iot
    rm *.h, *.c, *.d, *.o                         # 删除其它文件,保留gcc、image目录及prj_config.h
    mv xxx/Gizwits gz-iot                         # 将机智云生成的接入代码移动过来,主要包括Gizwits、User、Utils目录
    cd gz-iot/gcc                                 # 进入工程gcc编译目录
    vim Makefile                                 # 修改本工程编译参数,主要是加入本工程的包含文件路径
      INCLUDE_PATHS += -I$(PRJ_ROOT_PATH)
      INCLUDE_PATHS += -I$(PRJ_ROOT_PATH)/Gizwits
      INCLUDE_PATHS += -I$(PRJ_ROOT_PATH)/Utils
    make config                # 配置开发板类型(XR872, 40M)
    make lib                 # 编译库文件(包括声音驱动、图像显示、网络等,编译成相应模块的库文件.so)
    make                    # 编译hello工程,形成执行文件.axf
    make image                 # 将执行文件打包成烧录镜像文件.bin,生成文件../image/xr872/xr_system.img
    Windows电脑运行烧录软件,烧录到开发板。

机智云的接入代码,包括了完整的业务逻辑,如PRODUCT_KEY、dataPoint_t、gizwitsProtocol_t等,只需要参考生成的代码目录下的MCU_COMMON_User_Guide _V0.4.pdf文档,移植主要是4个方面的内容,代码量不大。

  • 实现串口打印驱动
    这个xr50模块已经实现,故程序中可用GIZWITS_LOG或printf打印调试信息。
  • 实现芯片复位函数
    这个根据芯片的指令来实现,若不需要从界面控制设备复位,也可以不实现。
  • 实现定时器
    需要根据xr50实现毫秒定时器,并设置回调函数为TIMER_IRQ_FUN。
  • 实现串口A驱动
    主要是实现WIFI数据收发的接口,可参考at_demo, wlan_demo示例工程的内容修改。

3.3 其它常用物联网模组

最简单的物联网控制芯片是乐鑫ESP WiFi芯片/模组,如ESP8266,该模组其实是一个WIFI模块,但集成了Tensilica L106 超低功耗32位微型MCU,该MCU除了用于控制WIFI功能外,对外开放该MCU剩余能力,所以支持编程开发,还带外围PIO,这样一个模组就是一个相对完整的开发板(一般同时购买带烧录器,整体约10多元),支持物联网开发,且各物联网平台对此模组都支持很好。
image.png

其它常用的物联网模组如下:
image.png

4. 展望

嵌入式芯片便宜、有方便调试的集成开发环境、可在线烧录,因此嵌入式或物联网开发目前还是很容易上手的。采用嵌入式开发,可以针对我们日常生活中情形开发智能设备,如自动浇花器、音乐门童等,充分展开你的想像力吧 :)

后续可关注RISC-V,是一个基于精简指令集(RISC)原则的开源指令集架构(ISA),但还没有成熟,喜欢DIY的可以多了解一下。近几年内应当都还是ARM的天下,ARM芯片不贵,还好用,资料全。

后续可关注Toit,是由 Google Chrome V8 团队开发的,创立于 2018 年,旨在为物联网
设备构建一个通用固件,以取代传统的开发流程。它们提供了一套全新的功能,甚至是一种专为物联网开发的类似 Python 的新编程语言。

BTW,目前商品化的物联网产品很多,建议大家可以直接从淘宝搜索购买使用哈,若实在没有的再考虑自己研发。我是米粉,喜欢用小米的产品,比如用小米智能插座(<50元)、小米温度计(<20元)、门窗检测器(<50元)来控制电脑运行,又便宜又好,插上小米插座,再将电脑电源插入,可以用手机APP远程控制电脑开关,也能查看房间温度,若温度高了,可以自动打开电扇降温,房间开门了,远程APP中也能查看到。电脑的用电量也是随时可以APP查看。


3SWorld
9 声望1 粉丝

产品经理