17532| 3
|
真能吊打树莓派吗?基于国产芯片的Python教学主控“行空... |
#项目起源# 这两年,受疫情的影响,芯片的价格都让人叹为观止,尤其是一些进口的芯片。正是由于这种原因,一些国内的公司会将自家 产品的主控芯片换成国产的CPU或者MCU,相信这种情况大家都有所耳闻。近期旺仔爸爸收到一款基于国产的CPU芯片制作的主控板,它是由DFRobot公司设计生产的主打Python教学的主控板,究竟它的表现如何,下面我们一起来看一下 图 1 行空板开箱 首先通过测试视频来全面了解一下行空板 #视频展示# #硬件介绍# 看完视频,我们来看一下这块主控板的具体参数从外包装我们知道主控板的名字叫行空板又称UNIHIKER,大家可能在这之前都没听说过行空板,但你可能听过Arduino Uno、micro:bit、掌控板亦或者是树莓派这类型的开源硬件。行空板也是一款专为Python编程教育而设计的开源硬件,是一块有着树莓派级别的性能,如micro:bit一样简单易上手,可以运行完整Python程序的神奇板子!采用单板计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和Python环境,预装了常用的Python第三方库,让广大师生只需两步就能进行Python教学,轻松胜任各种编程相关的开发场景,如搭建物联网系统、体验人工智能应用、编写电子游戏、进行科学实验、设计声光互动、开发可穿戴设备等。 图 2 行空板硬件介绍 行空板的正面是一块2.8寸的触摸彩色屏幕,第一眼看到这个屏幕,相信大家都会联想到树莓派,没错就是那个由于疫情原因现在天价的树莓派,那么行空板的面世,会不会与树莓派的价格有一定关系呢,这个问题留给大家去猜测。 图 3树莓派4B 既然从各方面去看,行空板与树莓派都有千丝万缕的相似之处,那么本次测评我们不妨就用最新的树莓派4B版本作为行空板的对标对象来展开测试,下面我们将树莓派和行空板的详细配置参数做详细比较 #性能参数介绍# 首先来看行空板的具体性能参数 图 4行空板参数 行空板详细配置如下:
实体按键:Home按键,A/B按键屏幕:2.8寸240*320 TFT彩屏麦克风传感器光线传感器LED灯ICM20689三轴加速度三轴陀螺仪蜂鸣器
USB Type-C *1 USB TYPE-A *1 microSD卡接口 *1 3Pin I/O *4 (其中支持3路PWM 2路ADC) 4Pin I2C *2 金手指: 19路无冲突I/O(支持I2C、UART、SPI、ADC、PWM)
之后,来看树莓派4B的具体性能参数 图 5树莓派4B参数 树莓派 4 B的详细配置如下:
Micro-HDMI 接口*2支持双4K 30HzUSB 3.0 接口*2USB 2.0 接口*2CSI 摄像头接口*1DSI 显示接口*1音频接口*1MicroSD 卡槽PoE(以太网供电)供电针GPIO 40针引脚接口
看完行空板和树莓派的参数,你可能会感觉有点眼花缭乱,不过没关系,我们总结出了以下几点供大家参考:
通过以上7点的比较,我们可以简单总结两块主控的特点行空板偏向简单、易操作的方向而树莓派更灵活自由,选择性更多,给用户更多自由创作的空间。对性能参数简单比较后,我们可以看出行空板和树莓派各有优势,相信你也会对这两款产品的硬件表现上有自己的看法,大家可以根据不同的使用场景需求来选择主控硬件参数了解完成,下面我们来体验一下控制板的软件部分树莓派已经发行了很多版本,关于树莓派的使用 方法很多朋友应该都非常熟悉而行空板是首发,它都能做哪些事情,与树莓派有什么不同,会不会是树莓派的替代品,现在我们就来上手试一下,首先来看一下行空板的系统 #控制板系统介绍# 与树莓派那种带有桌面的Linux系统不同的是,行空板基于Linux深度定制了一个系统界面,系统中取消了Linux的桌面,取而代之的是一个home主菜单,长按Home按键即可进入菜单,AB按键控制光标上下移动,Home按键确认。我想省去系统桌面的原因应该是为了节约内存,提高效率在行空板系统的主菜单中提供了对板子控制常用的功能:
图 6 行空板系统界面 下面我们一一介绍一下这些功能菜单 切换应用程序 此菜单中显示系统文件目录下的所有py程序,选中之后按Home按键确认即可开始运行,运行程序时长按Home按键可以退出运行的程序。 图 7 切换应用程序 应用开关 此菜单项提供了开关内置应用的功能:
图 8 应用开关 查看网络信息 此菜单提供了查看网络ip的功能:
图 9 网络信息 查看系统信息 此菜单显示系统运行的相关信息:
图 10 系统信息 开关无线热点 此菜单可开关行空板上的无线热点模式,当启动时,会显示板子的热点名称及密码,其他设备可搜索此热点并连接板子(设备会断网),此时板子固定IP为192.168.123.1 图 11 无线热点 本地Web主页访问 行空板上运行了一个Web网页服务,因此其他设备可以直接访问行空板的ip地址打开一个网页。 让其他设备(电脑、手机、平板)与行空板在一个网络中(可通过有线、无线、热点模式),然后打开设备上的浏览器,输入行空板的ip地址。例如使用有线连接电脑,打开电脑的chrome浏览器,输入板子的ip10.1.2.3,就可以打开界面。此页面显示板子的相关使用教程,可以方便打开官网、教程、论坛了解行空板相关资料。 图 12 web访问 应用开关设置 在Web网页的应用开关一栏中,可以设置SIoT和Jupyter应用程序的运行状态,可以开关服务,点击打开页面可以一键跳转到对应服务管理页面。SIoT是一个针对学校场景的开源免费MQTT服务器Jupyter是一个具有分步执行程序功能的Python代码编辑器 图 13 应用开关设置 网络设置 进入网络设置页面会自动扫描板子周围的Wi-Fi,在名称下拉框选择需要连接的Wi-Fi,在密码输入框输入密码,点击连接即可让行空板连接WiFi。 图 14 连接Wi-Fi 需要注意的是这里不支持中文Wi-Fi,另外热点仅支持2.4G Wi-Fi。 文件上传 此页面可以通过网页上传电脑中的文件到行空板上,适合用来适配其他不能直接通过ssh连接行空板的软件。 选择文件后点击上传即可上传文件到文件夹名称所在的文件夹下,如果重名则直接覆盖,删除文件夹将删除文件夹及其中所有文件。 图 15 上传文件 注:此处仅能上传到单个文件 VNC屏幕共享 行空板中内置开启了远程桌面服务,因此你可以在电脑上实时显示板子的界面,为教学演示或是截图写教程带来了便利关于远程访问的方式可以使用windows远程桌面访问 图 16 远程桌面 也可以使用VNC的软件进行访问 图 17 远程VNC访问 不论哪种方式,成功访问行空板后,就可以使用电脑鼠标来操作行空板了 图 18 远程访问行空板 熟悉了行空板的系统后,我们再来与树莓派系统做横向比较树莓派的系统需要由用户进行选择性烧录,给用户开放自由度的同时也提高了一定的门槛。树莓派常用的系统为官方提供的Raspbian带桌面的Linux系统,由于树莓派可以通过HDMI接口与显示器连接,所以当系统烧录完成后可以与显示器搭配组合成为一个微型电脑来使用 图 19 树莓派连接显示器 除此之外,树莓派也可以进行远程访问,方式有SSH,VNC,网线等,不过在使用这些功能之前都需要做大量的配置工作(比如远程访问是要获取树莓派的IP地址,开启VNC服务等等操作步骤)而行空板则没有系统桌面,也没有提供连接显示器的接口,只能通过USB接口或者远程的方式访问,好处是行空板出厂的系统提前做好了各种配置,用户只需要一键连接即可,节省时间,降低使用门槛,提高了效率,当然与之相对应的自由开发灵活度也会有所降低以上就是关于行空板和树莓派系统的横向比较介绍,相信不同阶段的用户需求是不同的,选择适合自己的即可 #上手测试# 对行空板的系统有了一定认识后,现在我们来上手测试一下,首先来看一下官方提供的文档https://wiki.unihiker.com/从官方文档我们知道行空板支持五种编程方式:Mind+编程、Jupyter编程、Thonny编程、SSH远程访问、VScode编程,本次测评我们以Mind+编程环境为例进行讲解,我们先在官方网站提供的百度网盘连接下载对应版本的编程环境 图 20 Mind+编程环境下载 软件下载并安装完成后,我们需要将行空板与电脑连接,官方文档中介绍的连接方式有很多种,我们采用USB数据线的方式进行测试行空板连接电脑后,在Mind+软件中点击“终端”按钮打开终端。随后,在软件的上方会出现“连接远程终端”的菜单,我们选择行空板的IP地址进行连接 图 21 Mind+连接行空板 连接完成,现在就可以开始程序设计了。程序设计第一步,加载行空板的Python库 unihiker库说明 unihiker库是专门为了便于行空板的使用而开发的Python库。我们可以借助unihike库中的GUI类来实现屏幕显示和控制,如显示文字、表情、按钮等,借助其中的Audio类来使用麦克风和外接喇叭,如录制语音,检测环境音量等行空板默认自带unihiker库,如果要安装也可以按照下面步骤进行操作安装库指令如下pip install unihikerunihiker库GUI导入方法from unihiker import GUI #导入包gui=GUI() #实例化GUI类 接下来,我们介绍一下unihiker库的基础使用方法 显示文字 我们在编程环境中输入如下测试程序 import timefrom unihiker import GUI #导入包 gui=GUI() #实例化GUI类 definfo_text_on_click(): print("文字被点击") info_text = gui.draw_text(x=120, y=320, text='你好',origin='bottom' ,onclick=info_text_on_click) whileTrue:#增加等待,防止程序退出和卡住 time.sleep(1) 程序中,设置了在行空板屏幕的底部位置显示文本通过“text='你好'”的方法实现,还设置了当点击文字后会打印输出“文字被点击”的字样,由“onclick=info_text_on_click”方法实现当文字被点击时执行函数“info_text_on_click” 程序运行后,会看到如下图所示的结果 图 22 显示文字 图 23 文字被点击后的效果 看了上述效果,行空板文字显示的位置是如何确定的呢?根据前面介绍的硬件参数,我们知道行空板的屏幕分辨率是240*320,左上角为坐标原点,如下图24所示,根据这样的坐标系,我们即可确定文字显示的具体位置 图 24 行空板坐标系 其中文字显示的代码中还有一个origin参数,它的作用是为了对齐控件,控件有9个对齐位置点,可以采用东南西北(ESWN)和上下左右(top/bottom/left/right)两种方法标识。 图 25 对齐方位 图 26 对齐图示 显示表情 文本显示过后,下面我们来测试在行空板的屏幕中显示表情,在编程环境中输入如下程序from unihiker import GUI #导入包import timegui=GUI() #实例化GUI类# 传入图片文件路径的方式emj1 = gui.draw_emoji(x=0, y=0, w=100, h=100, emoji="Wink", duration=0.1, onclick=lambda:print("emojis clicked"))emj2 = gui.draw_emoji(x=120, y=200, w=100, h=100, emoji="Smile", duration=1,origin="center" , onclick=lambda:print("emojis clicked"))whileTrue: time.sleep(1) #等待防止程序退出看不到效果 程序中,绘制表情的方法是gui.draw_emoji,其中包含的参数解释如下
程序运行后,会看到如下图27所示的效果,在屏幕的左上角和中间位置分别显示了眨眼睛和微笑的表情,并且点击表情会看到打印输出的内容 图 27 显示表情 图 28 表情被点击后的效果 显示二维码 学会了文本和表情的显示后,下面我们尝试在屏幕中显示二维码,在编程环境中输入如下测试程序from unihiker import GUI #导入包gui=GUI() #实例化GUI类gui.draw_qr_code(x=120, y=150, w=100, text="https://unihiker.com", origin ="center",onclick=lambda:print("qr clicked"))import timewhileTrue:#增加等待,防止程序退出和卡住 time.sleep(1) 观察程序,你会发现生成二维码的方法只需要一条指令draw_qr_code即可实现在这个方法中涉及到的参数如下
通过修改text的参数即可改变二维码的内容程序运行后的效果如下图29 图 29 显示二维码 行空板中板载了三个按键,这可以很方便的做一些人机交互的案例,下面我们来尝试一下按键的使用方法 按键侦测 按键侦测的指令是gui.wait_a_click()我们可以设置当按下A键时显示表情,程序如下from unihiker import GUI #导入包import timegui=GUI() #实例化GUI类gui.wait_a_click()# 传入图片文件路径的方式emj1 = gui.draw_emoji(x=0, y=0, w=100, h=100, emoji="Wink", duration=0.1, onclick=lambda:print("emojis clicked"))emj2 = gui.draw_emoji(x=120, y=200, w=100, h=100, emoji="Smile", duration=1,origin="center" , onclick=lambda:print("emojis clicked"))whileTrue: time.sleep(1) #等待防止程序退出看不到效果 你会看到,我们只是在显示表情的程序中增加了按键侦测的指令运行程序 ,可以看到当按下A键后才会在屏幕中显示表情,这里的等待A键按下是一种阻塞式的等待方式 图 30 按键侦测 行空板麦克风录音 行空板除了有板载按键之外,在行空板屏幕的上方还板载了声音采集的麦克风,下面我们来使用麦克风实现录音的效果,在编程环境中输入如下测试程序 from unihiker import Audio import time audio = Audio() #实例化音频 print("录音5秒") audio.record('5s.wav', 5) #录音5秒,存到文件5s.wav中 程序中,通过调用音频库Audio()中的audio.record('5s.wav', 5) 方法来实现录音,录音时长可修改由于行空板的系统不带电脑桌面,所以常规通过键盘输入汉字内容的操作就显得比较困难,这一点树莓派要比行空板做的好。不过,如果我们使用录音的方式将音频内容进行语音识别,然后再外接一个音响就可以实现智能对话,这样的另辟蹊径虽然准确性有可能不是很高,不过也算是一种优雅的解决办法了。那么,不妨我们就来尝试一下这种解决办法 行空板音播放频 行空板只需要一条指令就可以实现音频播放,指令如下audio.play('5s.wav')实现了录音及播放,究竟如何才能实现语音输入内容呢?这里需要除了要用到行空板自带的音频库以外还需要使用百度智能云的语音识别和语音合成功能比较方便的是,行空板出厂系统已经自带了这些库,我们只需要调用即可,不再需要花时间去配置调试了,在这一点行空板要比树莓派效率更高一些如果树莓派要实现此功能不单单要外接麦克风和音响,还需要配置各种第三方库来实现录音,语音识别,语音合成的功能,如下图所示为树莓派配置过程的部分截图 图 31 树莓派配置过程 百度语音识别 要实现语音识别,这里我们需要借助百度智能云平台中的人工智能语音技术来实现 图 32 百度智能云平台 不过在调用语音技术的功能时需要先在平台中注册账户,关于百度智能云的使用方法可以参考之前案例文章,这里就不过多强调了 准备工作完成,我们在编程环境输入如下测试程序,其中APP_ID,APP_KEY,SECRET_KEY需要修改为自己账号中的参数 #调用百度智能云,进行语音识别 defaudio_discern(audio_path): audio_type = "wav"""" 百度云的ID,免费注册 """ APP_ID = ' ' API_KEY = ' ' SECRET_KEY = ' ' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)# 读取文件 defget_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read()# 识别本地文件 text = client.asr(get_file_content(audio_path), audio_type, 16000) return text 如果将前文中的录音文件与语音识别程序结合在一起即可实现录音后识别的效果 百度语音合成 语音识别实现后,同样的方法我们可以借助百度智能云平台的语音合成技术实现将文本内容播放出来,在编程环境中输入如下测试程序,其中APP_ID,APP_KEY,SECRET_KEY需要修改为自己账号中的参数 #调用百度云,进行语音合成 defaudio_speech(text): APP_ID = ' ' API_KEY = ' ' SECRET_KEY = ' ' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) text=text result = client.synthesis(text, 'zh', 1, { 'vol': 10,})# 识别正确返回语音二进制 错误则返回dict 参照下面错误码 ifnot isinstance(result, dict): with open('auido.mp3', 'wb') as f: f.write(result) 在行空板中实现了录音、播放、语音识别和语音合成等功能后,下面我们来完成两个小任务 二维码生成器 第一个要制作的是二维码生成器,实现过程是:通过语音识别的方式将用户的音频识别为文字,然后使用生成二维码的指令,将文本内容封装在二维码中,测试程序如下from unihiker import GUI from unihiker import Audio import time from aip import AipSpeech #导入百度 AIaudio = Audio() #实例化音频 print("录音5秒") audio.record('5s.wav', 5) #录音5秒,存到文件5s.wav中 print("停止录音")#调用百度云,进行语音识别 defaudio_discern(audio_path = "5s.wav",audio_type = "wav"): """ 百度云的ID,免费注册 """ APP_ID = '' API_KEY = '' SECRET_KEY = '' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)# 读取文件 defget_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read()# 识别本地文件 text = client.asr(get_file_content(audio_path), audio_type, 16000) return textresult = audio_discern()print(result['result'][0]) result_text = result['result'][0] gui=GUI()gui.draw_text(x=40, y=44, color="red", text="二维码生成器", font_size=20) gui.draw_qr_code(x=130, y=200, w=150, text=result_text , origin ="center",onclick=lambda:print("qr clicked")) whileTrue: pass 程序运行后的效果如下图所示 图 33 二维码生成器 翻译助手 接下来我们要制作的第二个任务是翻译小助手,同样使用语音识别技术将用户说出的单词识别为文本信息,再将文本内容发送至有道翻译网站进行翻译,最后将翻译结果显示在行空板的屏幕中,测试程序如下图所示 #导入requests库import requests #导入json库import json from unihiker import GUI from unihiker import Audio import timefrom aip import AipSpeech #导入百度 AIaudio = Audio() #实例化音频 print("录音5秒") audio.record('5s.wav', 5) #录音5秒,存到文件5s.wav中print("停止录音") #调用百度云,进行语音识别 defaudio_discern(audio_path = "5s.wav",audio_type = "wav"): """ 百度云的ID,免费注册 """ APP_ID = '' API_KEY = '' SECRET_KEY = '' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)# 读取文件 defget_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read()# 识别本地文件 text = client.asr(get_file_content(audio_path), audio_type, 16000) return textresult = audio_discern()print(result['result'][0]) result_text = result['result'][0]#翻译函数 deftranslate(b):#将有道翻译API地址放入“url”变量中 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'#获取要翻译的内容 word = b#新建data字典,用来存放POST请求时需要携带的数据 data = {} data['i'] = word data['doctype'] = 'json' data['from'] = 'AUTO' data['to'] = 'AUTO' data['client'] = 'fanyideskweb'#向有道翻译API发送网络请求,并将返回的数据放入变量“http_data”中 http_data = requests.post(url=url,data=data).text#将http_data中的数据解析为json格式 dict_data = json.loads(http_data)#提取字典中的有效数据 result = dict_data["translateResult"][0][0]["tgt"] print(f'翻译结果:{result}')return(result) result_text = result_text.replace("。", "") result_f = translate(result_text) gui=GUI() gui.draw_text(x=80, y=44, color="red", text="翻译助手", font_size=20) gui.draw_text(x=10, y=88, color=(255,105,180), text="原文:", font_size=20) gui.draw_text(x=90, y=88, color=(0,191,255), text=result_text, font_size=18) gui.draw_text(x=10, y=150, color=(255,105,180), text="结果:", font_size=20) gui.draw_text(x=90, y=150, color=(0,191,255), text=result_f, font_size=18) whileTrue: pass 程序运行后效果如下图所示 图 34 翻译助手 通过两个案例的制作,相信你一定对行空板的基础使用方法有了一定了解,下面我们再来尝试一下行空板运行人工智能案例的效果 人工智能案例测试 首先在行空板官网下载案例代码,下载地址如下图所示 图 35 人工智能案例下载 案例下载完成,我们将“media-pipe”的程序放置在行空板的程序文件中 图 36 人工智能案例代码 程序加载完成后,首先点击1-install_dependency.py的程序运行,目的是安装配置该程序用到的第三方库第三库安装完成就可以运行2至8中的任意一个测试程序了 ,不过在运行这些程序之前需要将摄像头与行空板连接人脸关键点检测 图 37 人脸关键点检测 手部关键点检测 图 38 手部关键点检测 通过两个人工智能案例的体验,你会发现在行空板中运行一些人工智能的案例会很方便,几乎做到了一键体验,而对比树莓派的话,树莓派需要安装配置各种库和框架,这个过程可能需要花费大量的时间和精力,当然这个过程也是非常宝贵的。总结一下就是,行空板门槛低,适合小白入门体验,树莓派灵活自由,适合深度开发。除此之外,行空板还可以运行一些OpenCV的案例和物联网应用的案例,由于篇幅原因,这里我们就不展开介绍了,感兴趣的朋友可以在官网详细了解 #总结# 深度使用了行空板后的感受 由于行空板预制了各种各样的Python第三方库,所以原先只能在电脑端运行的Python程序,现在这个口袋式大小的行空板中就可以运行了。这里有的朋友可能会有疑问, 一些在开源硬件当中的MicroPython不是也可以运行Python程序吗?事实上,那是不一样的,MicroPython只能在单片机中运行部分Python程序。而行空板则能够运行完整的Python程序,由于运行场景的改变相信一些人工智能的项目或者是终端运行的项目将会向雨后春笋板涌现出来。那么现在我们再来回到开头的那个问题,行空板与树莓派的区别是什么?行空板能够取代树莓派吗?我的观点是行空板不能取代树莓派,通过横向的硬件性能参数对比,我们就可以看出来,树莓派是一个具有各种灵活接口的微型电脑,给用户的自由发挥空间更多,它不单单可以运行完整的Python程序,还可以处理各种多媒体任务。所以我更愿意把树莓派称作为一个口袋式的电脑。而行空板 不一样,它的系统由厂家深度定制,支持完整的Python,预制了各种第三方库,板载了常用的传感器,使用起来更加方便,易用。很明显行空板侧重的方向就是为了降低门槛,深度聚焦在Python教学应用场景中,适合学生拿在手上就可以验证各种各样的Python程序,甚至在一些科创比赛中如果有了行空板的加持,相信学生可以更好的驾驭人工智能的项目,所以我更愿意把行空板称作为一个口袋式的Python实验教具。 OK,以上就是我们本次测评的全部内容了 造物让生活更美好,我们下期再见 更多精彩内容请关注旺仔爸爸造物社 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed