树莓派视频监控方案 motionEyeOS 装配教程

我们介绍过很多树莓派(Raspberry Pi)配合摄像头做视频监控和拍照的方案,这些方案大多是基于 Raspbian 自带的摄像头模块操作工具 raspistill 和 raspivid,或者是需要自行安装 motion、avconv 或 GStreamer 软件来实现拍照和视频拍摄。那么有没有一个专门的树莓派摄像头系统软件呢?当然有,motionEyeOS 了解一下~

软硬件清单

motionEyeOS

树莓派 ZERO W

摄像头模块(日视或夜视)

适用于树莓派 ZERO 的摄像头软排线

microSD 卡

电源适配器

如果对性能方面有要求的话,也可以采用树莓派3B+。我们打算用树莓派 ZERO W,因为它尺寸小而且集成了无线网卡,可以很方便地安放在任何地方。这里墙裂推荐使用树莓派 ZERO W 摄像头套件,它包含了一个能将树莓派主板和红外夜视摄像头合体在一起的3D打印外壳。

安装 motionEyeOS

和安装其他树莓派系统一样,首先下载到 motionEyeOS 系统镜像文件。

https://github.com/ccrisan/motioneyeos/releases

如果是树莓派ZERO,这里选择 motioneyeos-raspberrypi-xxx.img.xz;如果使用的是树莓派2B或3B则分别下载 motioneyeos-raspberrypi2-xxx.img.xz 或 motioneyeos-raspberrypi3-xxx.img.xz。

xz 是压缩格式,需要用解压工具(在Windows上可以使用7-zip)解压出 img 文件,然后将 img 文件刷入到 microSD 卡。刷系统的步骤参考参考 安装树莓派系统到SD卡。

配置无线网络

这里说的是配置无线网络,如果你使用树莓派的有线网络则可以跳过这一步。配置方法参考这篇教程:

无屏幕和键盘配置树莓派WiFi和SSH

请注意此步骤,如果配置出错可能导致树莓派无法启动,那么就要重新刷入系统再试一次了。

组装树莓派和摄像头

将 SD 卡插入树莓派,用软排线将树莓派和摄像头连接起来,最后给树莓派上电。

首次启动系统

如果没有连接显示器,首次启动时建议等待时间久一些,系统需要花几分钟完成分区配置、摄像头检测等流程。

如果你将显示器接到树莓派上的话,还可以看到启动的每一步的执行情况和从路由器获得的IP地址,如图。

确认一下树莓派所连接的路由器开启了DHCP,一切顺利的话可以进路由器管理页面找到树莓派的IP地址(也可以试试用工具找到树莓派的IP地址)。

在浏览器的地址栏输入树莓派的IP地址,即可进入 motionEyeOS Web 界面。运气好的话,应该看到摄像头的内容了:

motionEyeOS 功能强大,点界面上方的 “person” 图标登录进去之后可以做一些高级配置。默认用户名 admin,密码留空。

基础配置

在通用设置中可以修改管理员密码和监控密码。

点击 “Apply” 按钮保存设置。

在通用设置中,可以将高级设置(Advanced Settings)开启,会出现更多选项,看起来马上变得专业多了是不是?这里可以设置时区、主机名、关机和重启摄像头。

更多配置

以下图片展示了 motionEyeOS 全部可配置的选项。

> Video Device(视频设备)

这里用来设置监控回传视频的分辨率、帧率等视频质量参数,如果你希望旋转画面也可以在这里设置。

Camera Name = “Garden”

Video Resolution = 1600×1200

Frame Rate = 2

> Video Streaming(视频流)

这些设置允许你根据网络情况调节传输到浏览器的视频流相关的参数。

Streaming Frame Rate = 1

Streaming Image Resizing = ON

Streaming Resolution = 50%

Motion Optimization = ON

> Still Images(保存照片)

这里可以设置保存多久的照片。

Preserve Pictures “For One Month”

> Movies(保存视频)

设置保存的格式,以及保存多久的视频。

Movie Format = H.264 (.mp4)

Preserve Movies “For One Week”

> Motion Detection(运动检测)

你可以设置运动检测来让摄像头只在检测到画面变化之后才工作,一段时间之后自动停止,直到再次检测到画面变化。这样可以节省很多资源。下面的参数用于调节触发条件:

Frame Change Threshold = 10%

Light Switch Detection = 75%

Motion Gap = 20

Captured Before = 5

Captured After = 5

Minimum Motion Frames = 10

Show Frame Changes = ON

查看保存的照片和视频

在摄像头运行过程中,点击右上角的图标,可以进入到已保存的照片和视频的清单。

相关资料

更多有关 motionEyeOS 和 树莓派 Zero 摄像头套件的连接:

MoodeAudio 音频播放器上手配置

MoodeAudio 是运行于树莓派等开发板的高品质音频播放系统。与 Volumio 类似,又有些许不同。它们声音表现是基本一致的,各种配置选项差别不大,MoodeAudio 所提供的选项稍多,播放功能和按键开关响应较 Volumio 也更灵敏。但没有 Volumio 的中文界面支持,相对而言更适合已经体验过 Volumio 的用户或更专业的用户使用。本文将结合 HiFi DAC 扩展板介绍 MoodeAudio 音频播放器上手配置的方法。

安装和使用

如果你是首次使用,推荐在 volumio.org 下载适用于树莓派的最新版系统镜像文件,解压获得 IMG 格式的镜像文件。 使用工具刷入系统后即刻开始享用! 镜像下载:

http://www.moodeaudio.org/#download

关于刷入系统的更多细节请参考文章:《Windows下安装树莓派系统到SD卡》、《使用 Etcher 给 SD 卡安装树莓派系统》。

系统初始配置

我们强烈建议你使用带有无线网卡的树莓派,MoodeAudio 预先将树莓派的无线网卡配置为了 Wi-Fi 热点,系统启动后可用手机或笔记本电脑搜寻无线网络,找到名为 moode 的无线网络,使用密码 moodeaudio 进行连接。如果你使用的树莓派不带无线网卡,请直接参考本节末尾进行操作。

连接之后用浏览器访问 http://moode.local 或 http://172.24.1.1(这是 MoodeAudio 默认的主机名和 IP 地址)。

菜单-Configure,-Audio 设置 DAC 选项,在 I2S audio device 选择 HiFiBerry DAC +,然后点击 SET 如图。

重启。

菜单-Configure,-Audio 设置 MPD options,EDIT OPTIONS。确认一下 audio device 选择的是“I2S audio device”,Volume control 是“Software”。点击 APPLY 按钮保存配置。

顺利的话到这里就已经可以通过 HiFi DAC 输出音频了。

在菜单 Network 里面可以配置网络,将 MoodeAudio 接入局域网。注意这里一定要一次设置正确,因为设置之后默认的热点将被撤销,届时只能通过路由器去找 MoodeAudio 的连接地址。

接入局域网之后还可以把 DLNA 服务端功能开启,共享树莓派上的音乐给其他 DLNA 客户端设备使用。

如果你使用的树莓派不带无线网卡,则需要通过有线接入到你的局域网,确保和你的终端(手机或电脑在同一个局域网内)。首先你需 要找到树莓派的 IP 地址,可以有多种方法:

MoodeAudio 系统,在浏览器中输入 http://moode 即可方便地访问到。

通过登录路由器的客户端列表寻找树莓派对应的IP地址。

通过外接显示器,查看系统启动信息中 DHCP 分配到的 IP 地址。

使用 Airplay 和蓝牙

MoodeAudio 的 Airplay 和蓝牙功能需要手动开启一下,配置很容易。另外还有蓝牙也可以一并开启。

以 iPhone 为例,当手机和树莓派处于同一局域网网段内时,快捷菜单中会自动发现可用的播放设备。选中即可将手机的声音输出到树莓派并通过 HiFi DAC 解码输出。

同样,手机也可以发现多了一个蓝牙设备。点击连接之后,在 WebUI 进行配对。

就可以连接上了。

这样就可以把树莓派当成蓝牙音箱的接收端一样使用了。

硬核配置法

还有一种一次性配置好全部选项的方法,比较硬核也很方便。就是在 SD 卡的根目录(boot 分区下)创建一个名为 moodecfg.txt 的文件,贴入以下内容,将其中的一些值替换成你需要的样子,保存即可。在下次系统启动的时候,会读入这个配置表自动进行配置。

########################################## # Copy this file to /boot/moodecfg.txt # worker will process it at startup then # delete it and automatically reboot. # # All param=value pairs must be present. # Set wlanssid= to start AP mode. # Example: wlanssid= ########################################## [names] hostname=moode browsertitle=moOde Player airplayname=Moode Airplay spotifyname=Moode Spotify bluetoothname=Moode Bluetooth squeezelitename=Moode upnpname=Moode UPNP dlnaname=Moode DLNA mpdzeroconf=Moode MPD [services] airplaysvc=0 upnpsvc=0 dlnasvc=0 [network] wlanssid=MySSID wlansec=wpa wlanpwd=MyPassword wlancountry=US apdssid=Moode apdchan=6 apdpwd=moodeaudio [other] timezone=America/Detroit themename=Standard accentcolor=Emerald

配置项的含义基本上可以顾名思义,有兴趣的朋友可以试试。

传送一份官方安装配置文档。

基于Raspberry Pi(树莓派)的MCC数据采集卡应用

编者按:工业上用的数据采集方案普遍基于 Windows 系统,而在Raspberry Pi(树莓派)被越来越多地应用到工业领域时,数据采集领域也终于出现了基于树莓派的产品和应用。我们之前有介绍过两款适用于树莓派的数据采集扩展板 MCC118 和 MCC152 大大降低了数据采集方案的应用成本。而下面要介绍的是如何给树莓派安装和使用 Windows 下通用的 MCC 数据采集卡,相信这会让数据采集又多了一个很不错的方案选项。

简介

树莓派是一种单板式计算机系统,可轻松连接鼠标、键盘、显示器等外设,并运行基于Linux®的操作系统,低于300人民币的成本,使树莓派尤其适用于注重性价比的数据采集应用。现在,Measurement Computing大部分USB、以太网和蓝牙数据采集设备已兼容树莓派。

目的

在树莓派上运行应用程序,控制MCC DAQ设备执行数据采集任务。本文详细介绍了以下关键步骤:

格式化SD卡

安装操作系统

配置树莓派

安装Linux设备驱动

安装MCC DAQ设备驱动,编译MCC提供的测试程序

运行MCC测试程序

适用人群

工作于树莓派(Linux)平台,熟悉MCC数据采集卡,并希望在此平台上实现数据采集功能。

必要条件

请预先准备以下内容:

树莓派硬件板卡 —— 本文使用model B,您可根据实际情况,使用任何型号

SD卡(8GB或更大容量)

PC 或 Mac®,可接入互联网

以太网电缆或无线适配器

显示器或电视机

供电电源

鼠标或轨迹球

键盘

MCC DAQ设备 —— 本文使用USB-1608FS

点击这里,了解支持Linux®和兼容树莓派的MCC数据采集卡

建议使用自供电USB Hub连接外设与树莓派。

下图展示了本文所用到的树莓派的配置:

鼠标和键盘通过USB Hub连接树莓派,并未在上图中显示。

安装操作系统

使用树莓派前必须安装操作系统。本文将安装Raspbian,基于Debian的开源操作系统,针对树莓派进行了大量优化,并通过NOOBS(New Out Of the Box Software)完成Raspbian的安装,NOOBS是树莓派官方发布的开源操作系统安装管理器。

借助SD卡拷贝NOOBS至树莓派,首先需要格式化SD卡,请参考以下详细步骤:

视频教程! Go to http://www.raspberrypi.org/help/noobs-setup/提供了详细的视频教程,包括格式化SD卡,下载NOOBS,安装Raspbian系统。

格式化SD卡

以下步骤将引领您下载NOOBS,并在树莓派上安装操作系统:

登陆www.sdcard.org,点击Download 下载页面底部的SD formatter for Windows or Mac 将SD卡插入PC或MAC,运行setup.exe,格式化SD卡

安装操作系统

以下步骤将引领您下载NOOBS,并在树莓派上安装操作系统:

登陆www.raspberrypi.org,点击Downloads.

点击NOOBS下的Download ZIP,保存至PC或MAC 解压zip文件,拷贝所有文件至SD卡 拔出SD卡,将其插入树莓派 连接显示器、鼠标、键盘和电源

上电后树莓派立即启动

首先会看到树莓派的Logo,后面是NOOBS主窗口,列出了全部可安装的操作系统 选中Raspbian复选框,点击Install,在Confirm对话框中选择Yes

安装进度将实时显示 选择OK,树莓派开始加载Raspbian

首次引导Raspbian,将弹出Setup Options菜单,通过键盘上的方向按键进行操作 根据需要配置相关选项,如语言、区域设置等 配置完成后,切换至并按下

命令行提示:pi@raspberrypi~$

恭喜您!至此已成功为树莓派安装了操作系统。

登陆信息

每次启动树莓派,都将提示以下登陆信息:

raspberrypi login: pi

password: raspberry

命令行提示:pi@raspberrypi~$

检查网络连接

在树莓派上下载MCC驱动程序前,请确认树莓派网络连接正确。可以通过以太网电缆或USB WiFi适配器连接网络,本文使用WiFi适配器。

双击桌面上WiFi Config图标,配置无线网络连接。Adapter:列出全部USB无线适配器(如wlan0); the Network:空 点击Scan,查看可用的无线网络 双击service set identifier (SSID)中待连接的无线网络 验证当前窗口中的Authentication 和 Encryption,在PSK (pre-shared key)中输入密码 点击Add

配置程序将自动连接至无线网络 重新启动树莓派,并输入上述登陆信息

登录之后,命令会立即显示pi@raspberrypi~$.

升级树莓派软件包

为确保您使用的是最新的树莓派软件包,输入以下命令

sudo apt-get update

下载 MCC的Linux驱动

MCC USB,蓝牙和以太网设备的Linux驱动程序保存在GitHub中。登录到Git库,下载最新的驱动软件包。

登录GitHub网页,获取Raspberry Pi的驱动:

https://github.com/wjasper/Linux_Drivers 点击下载按钮,选择下载压缩包 使用以下命令安装解压缩实用程序: sudo apt-get install unzip 在终端窗口中,找到到下载目录(使用cd命令),并将驱动程序文件解压缩到home / pi目录: unzip Linux_Drivers-master.zip -d ~pi

MCC驱动程序将持续保持更新,以支持更多设备。

单击下面的设备类型以转到安装驱动程序的过程:

安装MCC USB设备的Linux驱动,编译测试程序

在变异USB驱动之前,您必须安装与USB设备通讯所需的软件包

1、下载并安装libusb和libudev开发软件包

libusb为USB设备提供了通用C语言库

sudo apt-get install libusb-1.0-0 libusb-1.0-0-dev

2、拷贝USB规则文件到如下路径/etc/udev/rules.d,将它重命名为99-mcc.rules (避免了树莓派上标准命名问题):

sudo cp 61-mcc.rules /etc/udev/rules.d/99-mcc.rules

3、将hidapi GIT存储库克隆到home / pi目录中

HIDAPI需要与人机接口设备(HID)连接。

git clone git://github.com/signal11/hidapi.git

4、按照hidapi README.txt中的说明安装hidapi库:

a. 安装autotools,这是一套编程工具,旨在帮助将源代码包移植到类Unix系统。

autotools包是构建hidapi库所必需的。

sudo apt-get install libudev-dev libfox-1.6-dev autotools-dev autoconf automake libtool

b. 编译hidapi库:

cd ~pi/hidapi ./bootstrap ./configure make sudo make install

5、重启树莓派,根据提示输入登录信息

6、安装Linux驱动。

输入以下代码,安装USB驱动并编译测试应用程序:

cd ~pi/usb/mcc-libusb make sudo make install sudo ldconfig

安装MCC USB设备的Linux驱动,编译测试程序

执行以下步骤下载蓝牙库并编译蓝牙驱动程序。

在执行此过程之前,请确保您已经使用“下载第三方MCC Linux驱动程序”程序下载了蓝牙驱动程序.

1、安装蓝牙库

要编译蓝牙库,您需要添加bluez-libs-devel软件包。

sudo apt-get install libbluetooth-dev bluez-tools

2、编译蓝牙驱动

cd ~pi/Bluetooth make sudo make install

键入ls以列出所有文件。

3、使用MCC蓝牙DAQ设备运行示例测试应用程序

a. 插入MCC蓝牙设备。

b. Enter the name of a test program exactly as it is written, for example:

./test-bth1208LS

测试应用程序将显示您可以执行的测试列表。

c. 输入要执行的命令的字母。

安装以太网Linux驱动程序并编译测试程序

执行以下步骤编译以太网驱动程序。

在执行此过程之前,请确保您已使用“下载第三方MCC Linux驱动程序”过程下载了以太网驱动程序。

1、编译驱动

cd ~pi/Ethernet make sudo make install

键入ls以列出所有文件。 MCC以太网设备需要通过网络路由器进行连接。

2、使用MCC以太网DAQ设备运行示例测试应用程序。

a. 插入您的以太网设备

b. 输入完整的测试程序名称,例如:

cd ~pi/usb ./test-E-1608

测试应用程序将显示您可以执行的测试列表。

c. 输入要执行的命令的字母。

MCC测试程序

为Linux而开发的测试程序支持大部分MCC USB设备。程序将执行模拟通道、计数器通道和数字通道的数据采集,同时测试设备功能以及显示设备信息。

测试程序详见https://github.com/wjasper/Linux_Drivers上的USB/Mcc-libusb,Bluetooth,Ethernet文件夹,程序命名涵盖对应的设备型号,若设备从属于某系列,则此程序支持该系列全部设备,运行程序时,务必按照所列设备名称,正确键入设备名。

例如,使用USB-1608GX-2AO时,请运行程序”test-usb1608G”。

在树莓派上运行MCC DAQ设备测试程序

前往mcc-libhid目录,在命令提示符(pi@raspberrypi~)后输入以下命令,运行USB-1608FS测试程序:

cd ~pi/mcc-libusb ./test-usb1608FS

测试程序首先检测设备,并创建一张包含设备模拟输入校准参数(斜率和偏移)的表格。

表格建立完毕后,将显示全部可执行的设备测试功能

每项测试功能都有对应的热键,敲击键盘即可执行测试任务,程序有可能提示您输入更多信息,如通道数或频率大小,程序执行结果将打印在显示器上。

更多信息

任何关于Raspberry Pi的数据采集问题,请联系Measurement Computing Corporation:

更多Raspberry Pi相关信息,请参考www.raspberrypi.org.

Measurement Computing Corporation 和 Measurement Computing logo是属于Measurement Computing公司的商标或注册商标

Raspberry Pi是属于Raspberry Pi基金会的商标

Linux®是Linus Torvalds在美国和其他国家的注册商标

其他商标全部属于其持有者

鸣谢

特别感谢北卡罗来纳州立大学(North Carolina State University)的Warren Jasper博士(PE,教授,Textile Engineering Program Director)。Jasper博士长期以来一直帮助并支持Measurement Computing的USB、PCI数据采集卡的Linux设备驱动程序开发工作。我们对Jasper博士为Linux社区做出的不懈努力和奉献表示尊敬和感谢,没有他辛勤的工作和一如既往的支持,本文和本文提到的工程应用将无法实现。

其他技术文章请浏览MCC的数据采集技术文章页面

转自 http://china.mccdaq.com/TechTips/TechTip-9.aspx

用树莓派DIY“啪啪”声控开关

MAKER:Ash/译:趣无尽 Cherry(转载请注明出处)

20世纪90年代曾有一款风靡一时的“智能家居”产品,只需要拍拍手就可以使唤家里的家电。

当年的奥秘就藏在这个盒子里面,来回顾这段经典广告视频吧:

虽然现在的智能家居已经离智能更进一步,但就使用便捷性来说,拍拍手还是比吼一嗓子“XX精灵”要更有范儿吧!

下面我们介绍如何用树莓派实现一个“啪啪”声控开关。

在本项目中,它被用来控制 LED 灯的开关。项目是使用拍手来启动开关并执行基本命令。设备还可以通过拍手来实现其他操作,如关闭树莓派,调整灯光,播放音乐,激活电机,甚至可以将树莓派连接到社交媒体并发送推文等。总之,只要动动手就有无限可能~

材料清单

树莓派(Raspberry Pi)3B+ ×1

母对母跳线 ×2

红色 LED ×1

安装并更新Raspbian

安装最新版本的 Raspbian 。查看详细步骤。

安装树莓派的 GPIO

1、访问树莓派终端。你可以通过 Raspbian 桌面或使用 PuTTY 等远程登录工具来操作。

2、启用 SSH 。请点击查看,了解如何通过SSH登录树莓派。

3、运行以下脚本,安装 GPIO 工具。

树莓派拍手开关将激活 LED 灯。发送信号让它运行,在此,需要使用 GPIO 引脚,使用树莓派 GPIO 来控制它们。

pip install RPi.GPIO

安装 pyaudio

拍手动力机制将通过麦克风输入进行控制。要在脚本中使用音频,需要安装 pyaudio 。安装很简单,只需运行以下脚本即可。

sudo apt-get install python-pyaudio

安装树莓派“拍手”脚本

我使用的拍手检测脚本是由 nikhiljohn10在 github 上创建的。

可以在项目文件库中下载。

https://make.quwj.com/project/97

代码如下:

#!/usr/bin/python import pyaudio import sys import thread from time import sleep from array import array import RPi.GPIO as GPIO clap = 0 wait = 2 flag = 0 pin = 24 exitFlag = False def toggleLight(c): GPIO.output(c,True) sleep(1) GPIO.output(c,False) print(“Light toggled”) def waitForClaps(threadName): global clap global flag global wait global exitFlag global pin print “Waiting for more claps” sleep(wait) if clap == 2: print “Two claps” toggleLight(pin) # elif clap == 3: # print “Three claps” elif clap == 4: exitFlag = True print “Claping Ended” clap = 0 flag = 0 def main(): global clap global flag global pin chunk = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 44100 threshold = 3000 max_value = 0 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, output=True, frames_per_buffer=chunk) GPIO.setmode(GPIO.BCM) GPIO.setup(pin, GPIO.OUT) try: print “Clap detection initialized” while True: data = stream.read(chunk) as_ints = array(‘h’, data) max_value = max(as_ints) if max_value > threshold: clap += 1 print “Clapped” if clap == 1 and flag == 0: thread.start_new_thread( waitForClaps, (“waitThread”,) ) flag = 1 if exitFlag: sys.exit(0) except (KeyboardInterrupt, SystemExit): print “\rExiting” stream.stop_stream() stream.close() p.terminate() GPIO.cleanup() if __name__ == ‘__main__’: main()

请将其放在/home/pi目录下。

连接麦克风

树莓派通过麦克风收集拍手的声音,我使用 USB 麦克风。请将你的首选设备连接到树莓派。

根据房间里的噪音水平,你可能会发现不同麦克风的收音音频效果不一样。你可以使用在文本编辑器来编辑拍手脚本,手动调整拍手阈值。该项目需要对麦克风和拍手脚本设置进行一定程度的微调。

连接输出设备

触发“拍手”的设备是由你自己决定的。你可以选择激活特定设备、运行程序、播放特定声音、或其他由 Python 脚本触发的内容。

本教程中,使用2个拍子点亮 LED,4个拍子关闭 LED 。

将触发的设备连接到 GPIO 引脚。设置LED的接线电路如图所示。根据不同的 LED,你可能需要一个电阻。

测试拍手的次数

重启树莓派。打开终端或使用 SSH 连接到树莓派。运行 clap.py。

sudo python clap.py

拍手!如果一切正常,需要注册并检查终端确认。如果检测到拍手,程序将打出一行文字。

这是你微调麦克风灵敏度和调整拍击脚本设置的机会。尝试使用阈值限制来减少因拍手而检测到的额外噪音。

设置开机启动

把 clap.py 添加到 crontab 启动列表中。使用以下命令打开 crontab 文件。

crontab -e

在文件的底部,添加一行。

@reboot nohup python clap.py &

保存文件并关闭。现在,你的树莓派将在启动时自动开始侦听拍手声了。

测试成品

一切完成后,重新启动树莓派。

当它启动时,树莓派应该立即启动拍手检测脚本。大概10-20秒后即可拍手检测!

你现在可以用拍手去控制你想开关的任何设备!

via https://make.quwj.com/project/97

用树莓派DIY“啪啪”声控开关

用 Python 在多个输出设备上播放多个声音文件

有想过用一台主机给不同的设备同时播放不同的音频文件吗?如果你正准备搭建一个DJ应用,需要实现一副耳机和一组扬声器的混音效果;又或者你需要构建一组包含许多个扬声器的音乐系统,而每个扬声器都需要播放不同的音频文件,彼此之间需要实现同步……

下面这个 DEMO 演示了用树莓派驱动8个不同的扬声器,分别播放8种不同的单声道音频文件,不仅有视频,更有必要的说明:

下面是所用的的零部件清单。

所需要的项目源代码在这里:

https://github.com/esologic/pear

参照图片连接树莓派、USB 声卡、功放、USB HUB、扬声器和电源。

Multi-Audio 范例

首先给树莓派安装 sounddevice,用下面的命令即可。

sudo apt-get install python3-pip python3-numpy libportaudio2 libsndfile1 python3 -m pip install sounddevice soundfile

这里有4个音频文件,和 multi.py 在同一个目录下,目录结构如下。

multi_audio/ ├── 1.wav ├── 2.wav ├── 3.wav ├── 4.wav └── multi.py

这段代码基于 Python 的 sounddevice 库。

“”” multi.py, uses the sounddevice library to play multiple audio files to multiple output devices at the same time Written by Devon Bray (dev@esologic.com) “”” import sounddevice import soundfile import threading import os DATA_TYPE = “float32” def load_sound_file_into_memory(path): “”” Get the in-memory version of a given path to a wav file :param path: wav file to be loaded :return: audio_data, a 2D numpy array “”” audio_data, _ = soundfile.read(path, dtype=DATA_TYPE) return audio_data def get_device_number_if_usb_soundcard(index_info): “”” Given a device dict, return True if the device is one of our USB sound cards and False if otherwise :param index_info: a device info dict from PyAudio. :return: True if usb sound card, False if otherwise “”” index, info = index_info if “USB Audio Device” in info[“name”]: return index return False def play_wav_on_index(audio_data, stream_object): “”” Play an audio file given as the result of `load_sound_file_into_memory` :param audio_data: A two-dimensional NumPy array :param stream_object: a sounddevice.OutputStream object that will immediately start playing any data written to it. :return: None, returns when the data has all been consumed “”” stream_object.write(audio_data) def create_running_output_stream(index): “”” Create an sounddevice.OutputStream that writes to the device specified by index that is ready to be written to. You can immediately call `write` on this object with data and it will play on the device. :param index: the device index of the audio device to write to :return: a started sounddevice.OutputStream object ready to be written to “”” output = sounddevice.OutputStream( device=index, dtype=DATA_TYPE ) output.start() return output if __name__ == “__main__”: def good_filepath(path): “”” Macro for returning false if the file is not a non-hidden wav file :param path: path to the file :return: true if a non-hidden wav, false if not a wav or hidden “”” return str(path).endswith(“.wav”) and (not str(path).startswith(“.”)) cwd = os.getcwd() sound_file_paths = [ os.path.join(cwd, path) for path in sorted(filter(lambda path: good_filepath(path), os.listdir(cwd))) ] print(“Discovered the following .wav files:”, sound_file_paths) files = [load_sound_file_into_memory(path) for path in sound_file_paths] print(“Files loaded into memory, Looking for USB devices.”) usb_sound_card_indices = list(filter(lambda x: x is not False, map(get_device_number_if_usb_soundcard, [index_info for index_info in enumerate(sounddevice.query_devices())]))) print(“Discovered the following usb sound devices”, usb_sound_card_indices) streams = [create_running_output_stream(index) for index in usb_sound_card_indices] running = True if not len(streams) > 0: running = False print(“No audio devices found, stopping”) if not len(files) > 0: running = False print(“No sound files found, stopping”) while running: print(“Playing files”) threads = [threading.Thread(target=play_wav_on_index, args=[file_path, stream]) for file_path, stream in zip(files, streams)] try: for thread in threads: thread.start() for thread, device_index in zip(threads, usb_sound_card_indices): print(“Waiting for device”, device_index, “to finish”) thread.join() except KeyboardInterrupt: running = False print(“Stopping stream”) for stream in streams: stream.abort(ignore_errors=True) stream.close() print(“Streams stopped”) print(“Bye.”)

运行之后将分别在3个设备上播放 1.wav、2.wav 和 3.wav 音频文件。

via

如何修改树莓派的主机名

在支持 mDNS(multicast DNS) 的局域网中,使用主机名加上”.local”即可直接访问主机名对应的设备。例如,树莓派 Raspbian 系统默认的主机名为 raspberrypi,那么当树莓派接入网络之后,就可以使用 ping raspberrypi.local 来获得树莓派IP地址,当然也可以通过 http://raspberrypi.local 来访问树莓派的80端口上的 Web 服务(如果已经部署了的话)。

下面要介绍的是,如果修改树莓派的主机名,这样即便在有多个树莓派同时运行时也可以加以区分。

首先登录树莓派,修改 hosts 文件,命令如下:

sudo nano /etc/hosts

你会看到下面这行:

127.0.1.1 raspberrypi

将 raspberrypi 替换成要修改的名字。然后按 Ctrl+O 保存所做的修改,按 Ctrl+X 退出。下面是一个修改后的例子:

127.0.1.1 shumeipai

修改 hostname 文件

sudo nano /etc/hostname

默认情况下,这个文件只包含 raspberrypi 这一个名字。请将这里也替换成要修改的名字。

最后,重启树莓派。

如何使用 pip 给指定版本的 Python 安装模块

有时候树莓派上同时装了 Python2 和 Python3,这时如果使用 pip 安装模块,可能会出现本来需要安装到 Python2 的模块结果却被安装到了 Python3 下的情况。

比较保险的办法,是手动指定安装版本。

首先我们了解下如何查看 pip 命令当前对应的 Python 版本和路径。

pip -V pip 18.0 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5) pip2 -V #或 python2 -m pip -V pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7) pip3 -V #或 python3 -m pip -V pip 18.0 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)

可以通过 pip 指定 Python 的版本进行安装

#安装到 Python2.X 版本中 sudo pip2 install 模块名 #或 python2 -m pip install 模块名 #安装到 Python3.X 版本中 sudo pip3 install 模块名 #或 python3 -m pip install 模块名

卸载 pip 所安装的模块使用下面的命令,如果要卸载指定版本,参考安装命令修改即可。

sudo pip uninstall 模块名

用树莓派制造一台拍立得相机

MAKER:Action-Script/译:趣无尽 Cherry(转载请注明出处)

运用树莓派和热敏打印机来制造一台拍立得也不是什么难事儿啦,已经有很多 maker 实践过这类项目了。在这个项目中,我参考了其他的相关项目,加入了我自己的想法实现了一款令人满意的树莓派拍立得,一起来了解一下吧。

该项目使用了树莓派和热敏打印机。在其他的树莓派拍立得项目中多半使用的是树莓派2(目前尚不支持树莓派3版本)、广角镜头和摄像头模块。而我选择了树莓派 Zero W 和中大焦距镜头。

树莓派 Zero W 很小巧实用,包括摄像头接口和板载 WIFI 以及许多其他功能。大多数树莓派摄像头模块都配有广角镜头。我选择了 M12 镜头,其视场角为40°,可以达到与 45mm 焦距全画幅相机差不多的效果,画面更加自然,不扭曲。因为可以无线连接,所以支持远程遥控拍摄。

材料清单

硬件部分:

树莓派(Raspberry Pi)Zero W × 1

Mini TTL热敏打印机 × 1

树莓派摄像头模块 × 1

迷你摄像头(CSI)15针软排线 × 1

M12摄像头镜头 × 1

M12板镜头支架 × 1

按钮 × 1

5v/3.5A移动电源(最小3A) × 1

4700uF电解电容 × 1

直角USB适配器接口(公对母) × 1

2.1mm插孔连接至USB适配器接口 × 1

适配器(2.1mm插孔) × 1

单排排针 × 1

单排排座 × 1

两排针连接器 × 3

洞洞板 × 1

电线 × 若干

螺丝M3 x 6mm(6mm~10mm) × 2

方形螺母(M3 1,8mmx5,5mm) × 2

螺丝M2 x 6mm(6mm~10mm) × 2

热敏纸卷(57毫米) × 若干

8GB MicroSD卡 × 1

Mini HDMI适配器(ZEROW接显示器) × 1

Mini USB转USB(ZEROW接键盘) × 1

5v USB充电器 × 1

Prusa i3 mk3 3D打印机 × 1

电缆压接器(SN-28B) × 1

老虎钳 × 1

数码卡尺 × 1

螺丝刀 × 若干

软件部分:

Fusion 360 autodesk.com/fusion-360

Raspbian Jessie Lite raspberrypi.org/downloads/raspbian

ImageMagick www.imagemagick.org

zj-58 CUPS by adafruit https://github.com/adafruit/zj-58

软件设置和代码

在此步骤中,需要 USB 键盘和 HDMI 显示器。

将摄像头模块安装到树莓派,测试并检查是否正常。

系统设置

运行raspi-config:

$ sudo raspi-config

对于此项目,此选项是必需的:

Interfacing Options -> EnableCamera

Interfacing Options -> DisableSerial

Advanced Options -> Expand Filesystem

使用 raspi-config 设置Wi-Fi连接。使用网络连接来升级系统并下载所需的软件。

Network Options -> Wi-fi

你还可以启用 SSH,远程访问系统并进行快速更改。

Interfacing Options -> EnableSSH

安装软件

可以参考一下教程:

learn.adafruit.com/instant-camera-using-raspberry-pi-and-thermal-printer

sudo apt update

sudo apt install git cups wiringpi build-essential libcups2-dev libcupsimage2-dev

在adafruit github安装CUPS的栅格滤镜。

git clone https://github.com/adafruit/zj-58

cd zj-58 make sudo ./install

在 CUPS 系统上安装并将打印设置为默认值。

根据打印机具体情况,将“波特率”值调为为9600或19200。 (我的项目使用的是19200)

sudo lpadmin -p ZJ-58 -E -v serial:/dev/ttyAMA0?baud=19200 -m zjiang/ZJ-58.ppd sudo lpoptions -d ZJ-58

相机脚本

sudo apt-get install imagemagick

使用imagemagick提高对比度并将摄像头设置为默认的对比度和亮度,拍摄命令顺序如下:

raspistill -t 200 -co 30 -br 75 -w 512 -h 388 -n -o – | convert – -grayscale Rec709Luminance -contrast jpg:- | lp

这是我的参数的最佳值,你可以根据自己情况进行修改。

我使用相同的按钮来拍摄照片和关闭系统。

脚本单次长按4秒。

camera.sh

#!/bin/bash SHUTTER=20 # Initialize GPIO states gpio -g mode $SHUTTER up while : do # Check for shutter button if [ $(gpio -g read $SHUTTER) -eq 0 ]; then # Must be held for 4+ seconds before shutdown is run… starttime=$(date +%s) while [ $(gpio -g read $SHUTTER) -eq 0 ]; do if [ $(($(date +%s)-starttime)) -ge 5 ]; then shutdown -h now echo “power off” # Wait for user to release button before resuming while [ $(gpio -g read $SHUTTER) -eq 0 ]; do continue; done fi done if [ $(($(date +%s)-starttime)) -lt 2 ]; then echo “Click shut” raspistill -t 1800 -co 30 -br 75 -w 512 -h 388 -n -o – | convert –grayscale Rec709Luminance -contrast jpg:- | lp # date +”%d %b %Y %H:%M” | lp fi sleep 1 fi sleep 0.3 done

自动设置脚本为在系统开启时启动。

在最后的“exit 0”行之前修改文件 /etc/rc.local 和执行以下命令:

sh /home/pi/camera.sh

使用保存脚本文件的路径。

树莓派 Zero W 启用串行兼容

pi3-miniuart-bt 将树莓派 Zero W 蓝牙功能切换为使用 mini UART(ttyS0),并将 UART0/ttyAMA0 恢复为GPIO14和15。

禁用板载蓝牙并通过 GPIO14和15恢复 UART0/ttyAMA0,修改为:

sudo vim /boot/config.txt

添加到文件末尾

dtoverlay=pi3-disable-bt

禁用初始化调制解调器的系统服务,不使用 UART:

sudo systemctl disable hciuart

此配置的更多资料请参考:https://www.raspberrypi.org/documentation/configuration/uart.md

3D打印外壳

相机的外壳严丝合缝,尺寸较小,尽量的减少螺丝的设计。

设计分为3个部分:

1、底部,主要安装电源。

2、主体部分,安装树莓派、打印机和大部分的布线。

3、镜筒,主要安装相机镜头。

主体部分和镜筒主要针对打印功能进行优化,不需要支撑结构。外壳底部使用内部支撑材料打印成单品。我自己做了一个结实的样品来支持相机的结构。

这里提供了 stl 文件,你可以自行打印或进行修改。

打印所需文件请在项目文件库中自行下载。

https://make.quwj.com/project/100

连线

1、 将排针接头焊接到树莓派的 IO 接口。

2、 将树莓派插入面包板,然后开始测试设置。

3、 为了连接组件,我使用 2Pin 压接端子分离连接。

因此在组装过程中,组件可以单独连接到外壳上。安装简单,当组件发生损坏或升级硬件时可方便更换。

4、使用圆形插孔将4700uF 电容连接到 + 和 – 接头上。这将有助于在热敏打印机运行时保持电压稳定。确保电容器的负极(较短)脚连接到端子的负极而不是另一端。

5、连接圆形插孔和电容器,打印机电源线和树莓派 Zero W 。

6、将+5V焊接到PP1,将接地从电源焊接到电路板背面的 PP6,在电源 USB 的正下方,为树莓派供电。

7、将双排排座焊接到洞洞板,连接树莓派 IO 引脚。在洞洞板上,你可以连接按钮和打印机数据线。

8、将按钮连接到地 GND(引脚34)和 BCM20(引脚38)

9、打印机顺序如下:

打印机GND – > 树莓派GND(针脚6)

打印机RX – > 树莓派 TXD(引脚8,BCM14,UART发送)

打印机TX – > 树莓派 RXD(引脚10,BCM15,UART接收)

树莓派 40Pin 引脚对照表

组装

组装的过程非常的简单。

移动电源固定安装在机箱底座。但可以轻松进行充电、移除或更换。

我打印了几个针以将树莓派板连接到外壳上,并将镜头连接到外壳的其余部分。

所有电缆和组件的空间都不大。你应该合理利用空间,安排好内部布局。为了关闭机箱,底座和主体部分有两个相互配合的卡舌。正面有一个螺丝袋可以固定盒子。

完成,你现在就可以拍摄啦!

纳尼?!还需要美颜?等着吧……MAKER的世界没有什么是不可能的!

https://make.quwj.com/project/100

使用 Docker 构建你的 Serverless 树莓派集群

这篇博文将向你展示如何使用 Docker 和 OpenFaaS 框架构建你自己的 Serverless 树莓派集群。大家常常问我能用他们的集群来做些什么?而这个应用完美匹配卡片尺寸的设备——只需添加更多的树莓派就能获取更强的计算能力。

“Serverless” (无服务器)是事件驱动架构的一种设计模式,与“桥接模式”、“外观模式”、“工厂模式”和“云”这些名词一样,都是一种抽象概念。

这是我在本文中描述的集群,用黄铜支架分隔每个设备。

Serverless 是什么?它为何重要?

行业对于 “serverless” 这个术语的含义有几种解释。在这篇博文中,我们就把它理解为一种事件驱动的架构模式,它能让你用自己喜欢的任何语言编写轻量可复用的功能。更多关于 Serverless 的资料。

Serverless 架构也引出了“功能即服务服务”模式,简称 FaaS

Serverless 的“功能”可以做任何事,但通常用于处理给定的输入——例如来自 GitHub、Twitter、PayPal、Slack、Jenkins CI pipeline 的事件;或者以树莓派为例,处理像红外运动传感器、激光绊网、温度计等真实世界的传感器的输入。

Serverless 功能能够更好地结合第三方的后端服务,使系统整体的能力大于各部分之和。

了解更多背景信息,可以阅读我最近一偏博文:功能即服务(FaaS)简介。

概述

我们将使用 OpenFaaS,它能够让主机或者集群作为支撑 Serverless 功能运行的后端。任何能够使用 Docker 部署的可执行二进制文件、脚本或者编程语言都能在 OpenFaaS 上运作,你可以根据速度和伸缩性选择部署的规模。另一个优点是,它还内建了用户界面和监控系统。

这是我们要执行的步骤:

在一个或多个主机上配置 Docker (树莓派 2 或者 3);

利用 Docker Swarm 将它们连接;

部署 OpenFaaS;

使用 Python 编写我们的第一个功能。

Docker Swarm

Docker 是一项打包和部署应用的技术,支持集群上运行,有着安全的默认设置,而且在搭建集群时只需要一条命令。OpenFaaS 使用 Docker 和 Swarm 在你的可用树莓派上传递你的 Serverless 功能。

我推荐你在这个项目中使用带树莓派 2 或者 3,以太网交换机和强大的 USB 多端口电源适配器。

准备 Raspbian

把 Raspbian Jessie Lite 写入 SD 卡(8GB 容量就正常工作了,但还是推荐使用 16GB 的 SD 卡)。

注意:不要下载成 Raspbian Stretch 了

社区在努力让 Docker 支持 Raspbian Stretch,但是还未能做到完美运行。请从树莓派基金会网站下载 Jessie Lite 镜像。

我推荐使用 Etcher.io 烧写镜像。

在引导树莓派之前,你需要在引导分区创建名为 ssh 的空白文件。这样才能允许远程登录。

接通电源,然后修改主机名

现在启动树莓派的电源并且使用 ssh 连接:

ssh pi@raspberrypi.local

默认密码是 raspberry

使用 raspi-config 工具把主机名改为 swarm-1 或者类似的名字,然后重启。

当你到了这一步,你还可以把划分给 GPU (显卡)的内存设置为 16MB。

现在安装 Docker

我们可以使用通用脚本来安装:

curl -sSL https://get.docker.com | sh

这个安装方式在将来可能会发生变化。如上文所说,你的系统需要是 Jessie,这样才能得到一个确定的配置。

你可能会看到类似下面的警告,不过你可以安全地忽略它并且成功安装上 Docker CE 17.05:

WARNING: raspbian is no longer updated @ https://get.docker.com/ Installing the legacy docker-engine package…

之后,用下面这个命令确保你的用户帐号可以访问 Docker 客户端:

usermod pi -aG docker

如果你的用户名不是 pi ,那就把它替换成你的用户名。

修改默认密码

输入 $sudo passwd pi ,然后设置一个新密码,请不要跳过这一步!

重复以上步骤

现在为其它的树莓派重复上述步骤。

创建你的 Swarm 集群

登录你的第一个树莓派,然后输入下面的命令:

docker swarm init Swarm initialized: current node (3ra7i5ldijsffjnmubmsfh767) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ –token SWMTKN-1-496mv9itb7584pzcddzj4zvzzfltgud8k75rvujopw15n3ehzu-af445b08359golnzhncbdj9o3 \ 192.168.0.79:2377

你会看到它显示了一个口令,以及其它节点加入集群的命令。接下来使用 ssh 登录每个树莓派,运行这个加入集群的命令。

等待连接完成后,在第一个树莓派上查看集群的节点:

docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 3ra7i5ldijsffjnmubmsfh767 * swarm1 Ready Active Leader k9mom28s2kqxocfq1fo6ywu63 swarm3 Ready Active y2p089bs174vmrlx30gc77h4o swarm4 Ready Active

恭喜你!你现在拥有一个树莓派集群了!

更多关于集群的内容

你可以看到三个节点启动运行。这时只有一个节点是集群管理者。如果我们的管理节点死机了,集群就进入了不可修复的状态。我们可以通过添加冗余的管理节点解决这个问题。而且它们依然会运行工作负载,除非你明确设置了让你的服务只运作在工作节点上。

要把一个工作节点升级为管理节点,只需要在其中一个管理节点上运行 docker node promote 命令。

注意: Swarm 命令,例如 docker service ls 或者 docker node ls 只能在管理节点上运行。

想深入了解管理节点与工作节点如何保持一致性,可以查阅 Docker Swarm 管理指南。

OpenFaaS

现在我们继续部署程序,让我们的集群能够运行 Serverless 功能。OpenFaaS 是一个利用 Docker 在任何硬件或者云上让任何进程或者容器成为一个 Serverless 功能的框架。因为 Docker 和 Golang 的可移植性,它也能很好地运行在树莓派上。

如果你支持 OpenFaaS,希望你能 星标 OpenFaaS 的 GitHub 仓库。

登录你的第一个树莓派(你运行 docker swarm init 的节点),然后部署这个项目:

$ git clone https://github.com/alexellis/faas/ $ cd faas $ ./deploy_stack.armhf.sh Creating network func_functions Creating service func_gateway Creating service func_prometheus Creating service func_alertmanager Creating service func_nodeinfo Creating service func_markdown Creating service func_wordcount Creating service func_echoit

你的其它树莓派会收到 Docer Swarm 的指令,开始从网上拉取这个 Docker 镜像,并且解压到 SD 卡上。这些工作会分布到各个节点上,所以没有哪个节点产生过高的负载。

这个过程会持续几分钟,你可以用下面指令查看它的完成状况:

$ watch ‘docker service ls’ ID NAME MODE REPLICAS IMAGE PORTS 57ine9c10xhp func_wordcount replicated 1/1 functions/alpine:latest-armhf d979zipx1gld func_prometheus replicated 1/1 alexellis2/prometheus-armhf:1.5.2 *:9090->9090/tcp f9yvm0dddn47 func_echoit replicated 1/1 functions/alpine:latest-armhf lhbk1fc2lobq func_markdown replicated 1/1 functions/markdownrender:latest-armhf pj814yluzyyo func_alertmanager replicated 1/1 alexellis2/alertmanager-armhf:0.5.1 *:9093->9093/tcp q4bet4xs10pk func_gateway replicated 1/1 functions/gateway-armhf:0.6.0 *:8080->8080/tcp v9vsvx73pszz func_nodeinfo replicated 1/1 functions/nodeinfo:latest-armhf

我们希望看到每个服务都显示 “1/1”。

你可以根据服务名查看该服务被调度到哪个树莓派上:

$ docker service ps func_markdown ID IMAGE NODE STATE func_markdown.1 functions/markdownrender:latest-armhf swarm4 Running

状态一项应该显示 Running ,如果它是 Pending ,那么镜像可能还在下载中。

在这时,查看树莓派的 IP 地址,然后在浏览器中访问它的 8080 端口:

ifconfig

例如,如果你的 IP 地址是 192.168.0.100,那就访问 http://192.168.0.100:8080 。

这是你会看到 FaaS UI(也叫 API 网关)。这是你定义、测试、调用功能的地方。

点击名称为 “func_markdown” 的 Markdown 转换功能,输入一些 Markdown(这是 Wikipedia 用来组织内容的语言)文本。

然后点击 “invoke”。你会看到调用计数增加,屏幕下方显示功能调用的结果。

部署你的第一个 Serverless 功能:

这一节的内容已经有相关的教程,但是我们需要几个步骤来配置树莓派。

获取 FaaS-CLI

$ curl -sSL cli.openfaas.com | sudo sh armv7l Getting package https://github.com/alexellis/faas-cli/releases/download/0.4.5-b/faas-cli-armhf

下载样例

$ git clone https://github.com/alexellis/faas-cli $ cd faas-cli

为树莓派修补样例模版

我们临时修改我们的模版,让它们能在树莓派上工作:

$ cp template/node-armhf/Dockerfile template/node/ $ cp template/python-armhf/Dockerfile template/python/

这么做是因为树莓派和我们平时关注的大多数计算机使用不一样的处理器架构。

了解 Docker 在树莓派上的最新状况,请查阅: 你需要了解的五件事。

现在你可以跟着下面为 PC、笔记本和云端所写的教程操作,但我们在树莓派上要先运行一些命令。

注意第 3 步:

把你的功能放到先前从 GitHub 下载的 faas-cli 文件夹中,而不是 ~/functinos/hello-python 里。

文件夹中,而不是 里。 同时,在 stack.yml 文件中把 localhost 替换成第一个树莓派的 IP 地址。

集群可能会花费几分钟把 Serverless 功能下载到相关的树莓派上。你可以用下面的命令查看你的服务,确保副本一项显示 “1/1”:

$ watch ‘docker service ls’ pv27thj5lftz hello-python replicated 1/1 alexellis2/faas-hello-python-armhf:latest

继续阅读教程: 使用 OpenFaaS 运行你的第一个 Serverless Python 功能

关于 Node.js 或者其它语言的更多信息,可以进一步访问 FaaS 仓库。

检查功能的指标

既然使用 Serverless,你也不想花时间监控你的功能。幸运的是,OpenFaaS 内建了 Prometheus 指标检测,这意味着你可以追踪每个功能的运行时长和调用频率。

指标驱动自动伸缩

如果你给一个功能生成足够的负载,OpenFaaS 将自动扩展你的功能;当需求消失时,你又会回到单一副本的状态。

这个请求样例你可以复制到浏览器中:

只要把 IP 地址改成你的即可。

http://192.168.0.25:9090/graph?g0.range_input=15m&g0.stacked=1&g0.expr=rate(gateway_function_invocation_total%5B20s%5D)&g0.tab=0&g1.range_input=1h&g1.expr=gateway_service_count&g1.tab=0

这些请求使用 PromQL(Prometheus 请求语言)编写。第一个请求返回功能调用的频率:

rate(gateway_function_invocation_total[20s])

第二个请求显示每个功能的副本数量,最开始应该是每个功能只有一个副本。

gateway_service_count

如果你想触发自动扩展,你可以在树莓派上尝试下面指令:

$ while [ true ]; do curl -4 localhost:8080/function/func_echoit –data “hello world” ; done

查看 Prometheus 的 “alerts” 页面,可以知道你是否产生足够的负载来触发自动扩展。如果没有,你可以尝试在多个终端同时运行上面的指令。

当你降低负载,副本数量显示在你的第二个图表中,并且 gateway_service_count 指标再次降回 1。

结束演讲

我们现在配置好了 Docker、Swarm, 并且让 OpenFaaS 运行代码,把树莓派像大型计算机一样使用。

希望大家支持这个项目,星标 FaaS 的 GitHub 仓库。

你是如何搭建好了自己的 Docker Swarm 集群并且运行 OpenFaaS 的呢?在 Twitter @alexellisuk 上分享你的照片或推文吧。

观看我在 Dockercon 上关于 OpenFaaS 的视频

我在 Austin 的 Dockercon 上展示了 OpenFaaS。——观看介绍和互动例子的视频: https://www.youtube.com/embed/-h2VTE9WnZs

有问题?在下面的评论中提出,或者给我发邮件,邀请我进入你和志同道合者讨论树莓派、Docker、Serverless 的 Slack channel。

想要学习更多关于树莓派上运行 Docker 的内容?

我建议从 你需要了解的五件事 开始,它包含了安全性、树莓派和普通 PC 间微妙差别等话题。

via: https://blog.alexellis.io/your-serverless-raspberry-pi-cluster/ 作者: Alex Ellis 译者: haoqixu 校对: wxy 本文由 LCTT 原创编译, Linux中国 荣誉推出

英伟达发布 Jetson Nano 开发板仅售99美元

在刚刚结束的 GTC 2019 大会上,英伟达公司推出了 RTX Server、Data Science Server、Jetson Nano 等全新计算设备,以及大量软件工具,试图把自己的业务扩展到数据科学和超小型 IoT 设备等方面。

黄仁勋发布了两版 Jetson Nano:面向开发者、爱好者的 99 美元开发包;以及面向公司的 129 美元的产品模块。英伟达 Jetson 家族又有了新成员,如今包括面向自动驾驶的 Jetson AGX Xavier、面向边缘 AI 的 Jetson TX2。

Jetson Nano 及其开发板。

据黄仁勋介绍,Jetson Nano 是一个能够创建数百万智能系统的人工智能计算机。这款小型但强大的 CUDA-X AI 计算机为运行现代 AI 工作流程提供了 472 千兆位的计算性能。它非常节能,功耗低至 5 瓦特。Jetson Nano 开发板包含一块 4 核 A57CPU、128 核 Maxwell 架构 GPU 以及 4G 内存。看起来是比树莓派3 性能强一个等级的存在。

Jetson Nano 支持高清传感器,可以并行处理许多传感器并在每个传感器流上运行多个现有的神经网络。它还支持许多流行的人工智能框架,使得开发人员可以轻松地将他们喜欢的模型和框架集成到产品中。该开发包可以开箱即用地运行 Linux,拥有 4GB 内存和相机及其他附件所需的 I/O。

Jetson Nano 开发者工具包技术规格。

据英伟达博客介绍,Jetson Nano 可以运行大量网络,包括 TensorFlow、PyTorch、Caffe/Caffe2、Keras、MXNet 这些流行的机器学习框架的完整本地版本。通过实现图像识别、目标检测与定位、人体姿态估计、语义分割、视频增强和智能分析等能力,这些网络可被用于构建自动驾驶机器和复杂的 AI 系统。

下图展示了在各种流行模型的推理基准结果。Jetson Nano 在许多场景中实现了实时表现,能够处理多种高清晰视频流。

各种深度学习推理网络在 Jetson Nano 和 TensorRT 下的表现,使用了 FP16 精度,batch size 为 1。

此外,英伟达还将 Jetson Nano 与树莓派、英特尔的计算棒以及谷歌的 Edge TPU 开发版进行了对比,部分结果如下。

Jetson Nano 与树莓派、英特尔的计算棒以及谷歌的 Edge TPU 开发版的推理表现结果对比。

在树莓派上玩转 micro:bit 与 MicroPython

micro:bit 是一款由英国广播公司(BBC)推出的,用于青少年编程教育的ARM开发版。它板载蓝牙模块、加速度计、电子罗盘、三个按钮,5×5 点阵。在 Python 基金会的帮助下 micro:bit 支持 MicroPython 语言。本文将介绍如何在树莓派上安装 MicroPython 编辑器 mu,并将用 MicroPython 编写的程序上传到 micro:bit 上运行。

所需硬件

micro:bit 主板(购买)

microUSB 数据线

47‎欧电阻

母对母跳线

鳄鱼夹线

LED

树莓派及相关配件(购买)

安装软件

在终端下输入下面的命令安装软件:

sudo apt-get update && sudo apt-get install mu -y

打开 mu 编辑器

MicroPython 是基于 Python 3 的精简版本,主要用于微控制器(MCU)上。mu 是一款专为儿童设计的开源代码编辑器,可以在树莓派上运行。

在树莓派系统(桌面版)的主菜单中打开 mu。

将树莓派和 micro:bit 连接起来(使用microUSB数据线)。

系统会弹出下面的对话框:

点击取消即可。

使用 mu

mu 软件的设计考虑到使用者的年龄层,操作界面非常直观。

1.New 按钮将打开一个新文件。

2.Load 按钮用于打开您已经写入的现有代码。

3.Save 按钮保存您在可见卷标中的任何工作。

4.Flash 按钮将把你的代码刷写到micro:bit上。

5.Repl 按钮打开一个交互式外壳。

6.Zoom 按钮将改变窗口中文本的大小。

7.Theme 按钮可在明暗之间切换。 你可以选择你的偏好。

8.Help 按钮将打开Epiphany网络浏览器,并带您进入帮助页面。

9.Quit 按钮将推出 mu。

使用 REPL

REPL 是一个交互式的 Shell,它在micro:bit本身上运行。

点击Repl按钮,等待底部的交互式 Shell 打开:

您可以点击进入REPL并立即开始编写代码。尝试以下两行:

from microbit import * display.scroll(‘Woop, woop’)

看到文本滚动到micro:bit的LED矩阵吗?如果没有,您可以再次键入第二行滚动消息第二次:

display.scroll(‘Woop, woop’)

REPL是编写单行代码以测试它们的好地方,但对于较大的脚本则需要使用代码文件了。

编写并刷入代码

再次点击Repl按钮关闭REPL。

在主窗口中,您现在可以编写一个简单的小脚本来使用micro:bit的按钮:

from microbit import * while True: if button_a.is_pressed(): display.scroll(‘A PRESSED’) if button_b.is_pressed(): display.scroll(‘B PRESSED’)

现在您可以通过保存按钮来保存以上代码为 what_pressed.py 文件。

接下来,您需要使用神秘的 Flash 按钮。按下按钮,出现对话框:

micro:bit 的底部的琥珀色 LED 应该闪烁起来了,这是因为文件正在加载到 micro:bit 上。

轻触按键查看 LED 点阵中滚动的文字。

更多好玩的

另外,micro:bit 上还有 GPIO 金手指、加速度计和罗盘。

如果将 LED、电阻用鳄鱼夹线串接起来,如下所示。

我们可以通过以下代码实现晃动 micro:bit 让外部的 LED 闪烁,与此同时板载的点阵显示特定的图形。

from microbit import * shake = False while True: if shake: pin0.write_digital(1) display.show(Image.SQUARE) else: pin0.write_digital(0) display.clear() if accelerometer.was_gesture(‘shake’): shake = not shake sleep(500)

将以上代码刷入到 micro:bit 然后晃动它看看效果吧~

via

Raspberry Pi 电压信号输出/数字IO HAT

Norton 马萨诸塞州 – 2019年1月8日 Measurement Computing Corporation宣布推出基于树莓派的MCC 152电压输出和数字输入输出HAT。由于其灵活性和低成本,许多DAQ用户正在围绕树莓派设计系统。 而树莓派用户基数的不断增长,使单板计算机的使用在专业DAQ应用程序中更为普遍。

MCC 152具有两个0-5 V模拟输出,更新速率高达5 kS/s。还包括八条数字I/O,可以逐位配置为输入或输出。一个树莓派上最多可安装八个MCC HAT模块。结合之前发布的MCC 118,8通道电压测量HAT模块,用户可以基于树莓派轻松配置具有模拟输入,输出和数字I/O的多功能数据采集解决方案。

了解详情:http://china.mccdaq.com/DAQ-HAT/MCC-152.aspx

基于C / C ++®和Python™的MCC DAQ HAT开源命令库可以让用户在Linux系统上开发应用程序。该库可从GitHub下载。同时还提供了全面的API和硬件文档。

关于Measurement Computing

Measurement Computing设计和制造易于使用,轻松集成,快速支持的数据采集设备。为程序员和非程序员提供非常多的软件方案选择。免费技术支持, 有限终身保修和低拥有成本使Measurement Computing成为DAQ最简单的选择。

有关Measurement Computing的更多信息,请访问 china.mccdaq.com.

树莓派制造日视/夜视串流直播摄像头

MAKER:WalterK26/译:趣无尽 Cherry(转载请注明出处)

关于摄像头的案列,之前我们已经发表过《用树莓派做 RTMP 流直播服务器,可推送至斗鱼直播》、《180度小球追踪摄像头》、《用本地网络控制的树莓派摄影云台》等内容。

今天要介绍的是一台可以做直播的摄像头,它实际上是将摄像头和树莓派 Zero W 用一个精巧的3D打印外壳封装在了一起,支持热点接入、能够在任何手机或平板电脑上轻松连接到摄像头观看,整合程度更近了一步!

下面让我们一起看看具体的实现吧~

2019-4-11 更新,趣无尽提供了基于这个项目的改进版本实物套件,点这里可以直接购买全套。

材料清单

树莓派(Raspberry Pi)Zero W 套件 × 1

夜视鱼眼广角摄像头500万像素1080P带2个红外灯 × 1

16cm FFC 软排线 × 1

Micro SD卡 × 1

直流免电池电路 5V × 1

直流电源插头 × 1

2x1mm电线(10cm长 黑红色) × 1

M3x6mm内六角螺钉 × 8

M2.5x3mm内六角螺钉 × 44

3D打印前板 × 1

3D打印外壳 × 1

3D打印背板 × 1

12x12x3mm铝制板 × 1

40x20x3mm 铝制板 × 1

2排针母杜邦连接器 × 2

1mm热缩管(4cm 长) × 1

该项目还需要打印备用背板。

3D打印部件

前板和外壳使用PLA打印,背板使用PETG打印,因为铝板会变很热。

在thingiverse下载3D STL文件。

1、先将文件“front_txt.stl”打印成黑色,将打印机灯丝更换为白色。

2、然后再打印“front.stl”文件。

打印机设置:

前板:100%填充

附件:50%填充

背板:100%填充

3D STL文件请在项目文件库中下载。

注意:打印速度和温度取决于你的3D打印机和灯丝。

安装 Raspberry Pi Zero W

1、烧录树莓派系统并配置

Windows 参考这篇文章、macOS 参考这篇。

2、配置摄像头

参考这篇文章中,开启摄像头并让树莓派正确识别到摄像头的部分。

3、安装uv4l核心和服务器

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add – #添加下面这行到 /etc/apt/sources.list 并保存 deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main sudo apt-get update sudo apt-get install uv4l-server uv4l-raspicam uv4l-raspicam-extras sudo service uv4l_raspicam restart sudo rpi-update

出处

4、创建网页

#去掉下面几行前的注释 server-option = –enable-www-server=yes server-option = –www-root-path=/usr/share/uv4l/www/ server-option = –www-port=80 sudo mkdir /usr/share/uv4l/www cd /usr/share/uv4l/www sudo nano index.html

将项目文件中 index.html 中的内容复制进去并保存。

5、将树莓派配置成热点和 DHCP 服务器

sudo systemctl stop dnsmasq sudo systemctl stop hostapd sudo reboot

重启。

sudo nano /etc/dhcpcd.conf interface wlan0 static ip_address=192.168.100.1/24 nohook wpa_supplicant sudo service dhcpcd restart sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo nano /etc/dnsmasq.conf

修改如下:

interface=wlan0 # Use the require wireless interface – usually wlan0 dhcp-range=192.168.100.2,192.168.100.20,255.255.255.0,24h address=/#/192.168.100.1

sudo nano /etc/hostapd/hostapd.conf

修改如下:

interface=wlan0 driver=nl80211 ssid=HorseOnTour hw_mode=g channel=7 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0

sudo nano /etc/default/hostapd

修改如下:

DAEMON_CONF=”/etc/hostapd/hostapd.conf”

sudo systemctl start dnsmasq sudo reboot

出处

组装树莓派的摄像机并将其安装在前板上

1、如图所示组装树莓派摄像头。为方便安装在前板上,我从前面的树莓派摄像头板上粘贴的4个螺丝。

2、将带状电缆连接到摄像头。

3、将摄像头连接到前板。小心地将橡胶部件与前板上的孔对齐。同时请注意,请握紧摄像头的尾端,因为它很容易断裂。

4、拧紧树莓派摄像头上的4个螺丝。

5、将红外镜头从前面穿过电路板上的大孔。

6、将光学镜头从前面拧入插座。

电源连接

1、如果你有杜邦线,你可以用。如果在电压调节器和直流电源插座之间不焊接一条1厘米长的电缆。那么注意将其焊接在右侧(输入)。

2、焊接5厘米长的电缆到电压调节器(输出)。

准备你的树莓派

1、焊接2排针针头到5V和接地,并连接到树莓派Zero W。焊接电路图请点击链接。

2、小铝板上贴上双面胶。

3、将小铝板贴在树莓派 Zero W的 CPU上。

4、用带状电缆将摄像头连接到树莓派。

5、将大块铝板放入3D打印的背板上,并将其放置到树莓派 W的上面。将板子用四个2.5mm的螺丝拧到背板上。

组装完成

1、这一步就可以完成摄像头的组装。将带有摄像头的前板安装到外壳上,并用四个 3mm的螺丝将其拧紧。

2、使用电缆将电压调节器连接到树莓派 Zero W 上。

3、小心地将带状电缆和电源线折叠在外壳内并关闭摄像头。注意不要夹住任何电缆。

4、使用四个3mm的螺丝拧到外壳上。

完成啦,我想说这个外壳真心很不错!

树莓派制造日视/夜视串流直播摄像头

浅析 fstab 与移动硬盘挂载方法

本文转自 Steins;Lab,非常详细地介绍了树莓派上 fstab 的配置项。

近期自己的Raspberry Pi出了点问题,总结总结便有了这篇文章。

本文首先记录“移动硬盘挂载”实际发生的问题,然后浅析了fstab这一重要配置文件和使用,最后总结了Raspberry Pi上自动挂载移动硬盘的方法。本文主要基于Raspberry Pi和Raspbian描述问题,当然它也广泛适用于各Linux发行版环境中 ; )。

1 问题描述和解决

之前,我的一块Raspberry Pi作为一个简单的NAS,通过 fstab 文件实现了开机自动挂载移动硬盘。

根据网上别人嚼过的东西,没有深究。fstab如下:

proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 UUID=FD720D1BCFDB2930 /media/pi/usbhdd ntfs defaults,noatime 0 0 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that

使用UUID作为标识挂载了一块NTFS的移动硬盘,参数为 defaults,noatime ,一直以来相安无事。

直至,我把移动硬盘拔掉后开机,无法正常引导进入系统。

我一度以为是我经常暴力关机导致tf卡文件系统损坏。连上显示器和键盘救援一下,boot过程在

[** ]A start job is running for dev-disk-by\x2duuid-XXXXXXXX.device (xx s / 1min 30s)

随即进入emergency mode。大致知道原因了:未找到fstab中指定的硬盘

根据Archlinux wiki,若要将其设置为可忽略,可添加 nofail 选项[1]:

外部设备在插入时挂载,在未插入时忽略。这需要 nofail 选项,可以在启动时若设备不存在直接忽略它而不报错. /etc/fstab /dev/sdg1 /media/backup jfs defaults,nofail 0 2 External devices that are to be mounted when present but ignored if absent may require the nofail option. This prevents errors being reported at boot. For example: /etc/fstab /dev/sdg1 /media/backup jfs nofail,x-systemd.device-timeout=1 0 2 The nofail option is best combined with the x-systemd.device-timeout option. This is because the default device timeout is 90 seconds, so a disconnected external device with only nofail will make your boot take 90 seconds longer, unless you reconfigure the timeout as shown. Make sure not to set the timeout to 0, as this translates to infinite timeout. If your external device requires another systemd unit to be loaded (for example the network for a network share) you can use x-systemd.requires=x combined with x-systemd.automount to postpone automounting until after the unit is available. For example: /etc/fstab //host/share /net/share cifs noauto,nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10,workgroup=workgroup,credentials=/foo/credentials 0 0

综合参考[2],我最终的fstab文件如下:

proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 UUID=FD720D1BCFDB2930 /media/pi/usbhdd ntfs defaults,nofail,x-systemd.device-timeout=1,noatime 0 0 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that

即使boot阶段没有接入移动硬盘,也能正常启动。

2 fstab

fstab文件可以被用来定义磁盘分区,各种其他块设备,或远程文件系统应如何安装到文件系统。

每个文件系统都在一个单独的行中描述。这些定义将在引导时动态转换为systemd安装单元,并在重新加载系统管理器的配置时。

在第一节中可以看到典型的fstab结构。

2.1 手册和wiki

关于fstab,wiki上已经写得非常清晰了,参考链接如下:

https://help.ubuntu.com/community/Fstab

http://manpages.ubuntu.com/manpages/bionic/en/man5/fstab.5.html

https://wiki.archlinux.org/index.php/Fstab

其中,ArchLinux Wiki中给出了一些针对各类场景的fstab使用技巧,如果你正遇到某些问题,不妨一读:

2.2 理解

各类参数解释在上wiki中已经详细给出,能搜到的博文有许许多多。这里是我的一些理解和总结:

fstab 的作用是定义磁盘分区,也可定义其他block设备和远程文件系统。它所做出的指定,会在系统引导时挂载。

mount 命令和 fstab 也是有关系的。当 mount 参数给出一个时,剩余的参数会在 fstab 中查找[3]。

这也就意味着,除非指定某些选项,否则 /etc/fstab 在启动时和使用 mount -a 时,将自动挂载所有指定的设备。这时,若其中设备不存在将导致错误。这时需要用到的选项有 noauto , nofail 。

2.3 参数归纳

一个典型的fstab结构如下:

#

/dev/sda1 / ext4 noatime 0 1 /dev/sda2 none swap defaults 0 0 /dev/sda3 /home ext4 noatime 0 2

每一行由以下参数组成

描述了要安装的块特殊设备或远程文件系统; 请参阅#Identifying filesystems。

描述了要安装的块特殊设备或远程文件系统; 请参阅#Identifying filesystems。

介绍了安装目录, 该文件系统类型,以及 相关的安装选项; 见 和 。

介绍了安装目录, 该文件系统类型,以及 相关的安装选项; 见 和 。 由 实用程序检查。此字段通常设置为 0 ,禁用检查。

由 实用程序检查。此字段通常设置为 ,禁用检查。 设置启动时文件系统检查的顺序; 见 。对于根设备应该是 1 。对于其他分区应该是 2 ,或 0 禁用检查。

options常用参数类型:

auto – 在启动时或键入了 mount -a 命令时自动挂载。

– 在启动时或键入了 命令时自动挂载。 noauto – 只在你的命令下被挂载。

– 只在你的命令下被挂载。 exec – 允许执行此分区的二进制文件。

– 允许执行此分区的二进制文件。 noexec – 不允许执行此文件系统上的二进制文件。

– 不允许执行此文件系统上的二进制文件。 ro – 以只读模式挂载文件系统。

– 以只读模式挂载文件系统。 rw – 以读写模式挂载文件系统。

– 以读写模式挂载文件系统。 user – 允许任意用户挂载此文件系统,若无显示定义,隐含启用 noexec , nosuid , nodev 参数。

– 允许任意用户挂载此文件系统,若无显示定义,隐含启用 , , 参数。 users – 允许所有 users 组中的用户挂载文件系统.

– 允许所有 users 组中的用户挂载文件系统. nouser – 只能被 root 挂载。

– 只能被 root 挂载。 owner – 允许设备所有者挂载.

– 允许设备所有者挂载. sync – I/O 同步进行。

– I/O 同步进行。 async – I/O 异步进行。

– I/O 异步进行。 dev – 解析文件系统上的块特殊设备。

– 解析文件系统上的块特殊设备。 nodev – 不解析文件系统上的块特殊设备。

– 不解析文件系统上的块特殊设备。 suid – 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。

– 允许 suid 操作和设定 sgid 位。这一参数通常用于一些特殊任务,使一般用户运行程序时临时提升权限。 nosuid – 禁止 suid 操作和设定 sgid 位。

– 禁止 suid 操作和设定 sgid 位。 noatime – 不更新文件系统上 inode 访问记录,可以提升性能(参见 atime 参数)。

– 不更新文件系统上 inode 访问记录,可以提升性能(参见 atime 参数)。 nodiratime – 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。

– 不更新文件系统上的目录 inode 访问记录,可以提升性能(参见 atime 参数)。 relatime – 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。

– 实时更新 inode access 记录。只有在记录中的访问时间早于当前访问才会被更新。(与 noatime 相似,但不会打断如 mutt 或其它程序探测文件在上次访问后是否被修改的进程。),可以提升性能(参见 atime 参数)。 flush – vfat 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。

– 的选项,更频繁的刷新数据,复制对话框或进度条在全部数据都写入后才消失。 defaults – 使用文件系统的默认挂载参数,例如 ext4 的默认参数为: rw , suid , dev , exec , auto , nouser , async .

3 Desktop Environment的自动挂载

实际使用Raspbian桌面版的同学们可能发现了,在PIXEL(LXDE)桌面环境中,即使我们没有设置 fstab ,插入usb存储设备后,它将自动被挂载到 /media//

这个功能我们在Linux各个发行版的桌面版本都用到过。自动挂载对于桌面用户,非常友好。通常由GUI/DE协同处理[4]。对于Raspbian来说,在PIXEL自带的PCManFM文件管理器中,对自动挂载usb存储设备的设置选项如下:

有趣的是,我曾经分别以root和pi的账户开启了2个PIXEL桌面。此时插入USB存储介质时,某一个桌面就会显示挂载冲突。这也使我开始意识到自动挂载是由GUI/DE操作的。

若你的Raspberry Pi作为远端服务器设备,也在运行桌面版,不妨使用Desktop Environment作为你的工具帮你实现自动挂载。

参考资料

[1] Archlinux Wiki – Fstab https://wiki.archlinux.org/index.php/Fstab

[2] How to setup mount / auto-mount USB Hard Drive on Raspberry Pi https://gist.github.com/etes/aa76a6e9c80579872e5f

[3] mount(8) – debian wiki https://manpages.debian.org/jessie/mount/mount.8.en.html

[4] Stock Pi3 – what process is auto-mounting removable media? https://raspberrypi.stackexchange.com/questions/65739/stock-pi3-what-process-is-auto-mounting-removable-media

用树莓派制造的“电脑鼠标”一体机

最近,一位名叫电子手榴弹(Electronic Grenade)的 MAKER 发布了一项黑科技——电脑鼠标(The Computer Mouse)。

Electronic Grenade 的电脑鼠标必然是“颠覆苹果”的黑科技,不信的话你可以看看下面的视频。只要一个鼠标就能完成电脑才能干的事情!我在想要不要去微博艾特下龙哥:)

这是一款“电脑鼠标”一体机麻雀虽小五脏俱全,配备了鼠标、一块1.5英寸OLED屏幕(在鼠标上,翻盖式)、蓝牙键盘(还是在鼠标上,隐藏侧滑式)、主机(是的,在鼠标的内部,一块 Raspberry Pi Zero W)、一块 500mAh 电池(鼠标内置,可充电)。

这才是真正的“电脑鼠标”。