用树莓派实现实时的人脸检测

本文介绍了如何在树莓派上,使用 OpenCV 和 Python 完成人脸检测项目。该项目不仅描述了识别人脸所需要的具体步骤,同时还提供了很多扩展知识。此外,该项目并不需要读者了解详细的人脸识别理论知识,因此初学者也能轻松跟着步骤实现。

项目所需设备

硬件:
树莓派3
树莓派摄像头模块(PiCam)

语言和库:
OpenCV
Python 3

本文主要讲述如何使用 PiCam 实现实时人脸识别,如下图所示:

本教程使用 OpenCV 完成,一个神奇的“开源计算机视觉库”,并主要关注树莓派(因此,操作系统是树莓派系统)和 Python,但是我也在 Mac 电脑上测试了代码,同样运行很好。OpenCV 具备很强的计算效率,且专门用于实时应用。因此,它非常适合使用摄像头的实时人脸识别。要创建完整的人脸识别项目,我们必须完成3个阶段:

1)人脸检测和数据收集;
2)训练识别器;
3)人脸识别。

如下图所示:

第1步:材料清单

主件:
树莓派3
500 万像素 1080p 传感器 OV5647 迷你摄像头模块

第2步:安装OpenCV 3包

我使用的是更新了最新版树莓派系统(Stretch)的树莓派 V3,因此安装 OpenCV 的最佳方式是按照 Adrian Rosebrock 写的教程来进行:《Raspbian Stretch: Install OpenCV 3 + Python on your Raspberry Pi》。经过几次尝试后,我觉得Adrian的教程最好,建议按照该教程一步步来安装。

完成上述教程之后,你应该安装好了 OpenCV 虚拟环境,可用于在树莓派设备上运行本次实验。
我们来到虚拟环境,确认 OpenCV 3 已经正确安装。
Adrian 推荐在每次打开新的终端时都运行命令行“source”,以确保系统变量都得到正确设置。

source ~/.profile

然后,我们进入虚拟环境:

workon cv

如果你看到 (cv) 出现在提示符之前,那么你就进入了 cv 虚拟环境:

Adrian 希望大家注意 cv Python 虚拟环境是完全独立的,且与 Raspbian Stretch 中包含的默认 Python 版本彼此隔绝。因此,全局站点包目录中的任意 Python 包对于 cv 虚拟环境而言都是不可用的。类似地,cv 站点包中的任意 Python 包对于全局 Python 包安装也都是不可用的。

现在,进入 Python 解释器,确认你正在运行3.5(或以上)版本。

在解释器内部(将出现>>>),导入 OpenCV 库:

import cv2

如果没有错误信息,则 OpenCV 已在你的 Python 虚拟环境中正确安装。

你还可以检查已安装的 OpenCV 版本:

cv2.__version__

上面的终端截图显示了以上步骤。

第3步:测试摄像头

在树莓派上安装 OpenCV 之后,我们测试一下,以确认摄像头正常运转。假设你已经在树莓派上安装了 PiCam。

在 IDE 中输入下列 Python 代码:

import numpy as np
import cv2
 
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
  
while(True):
    ret, frame = cap.read()
    frame = cv2.flip(frame, -1) # Flip camera vertically
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
     
    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)
     
    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break
 
cap.release()
cv2.destroyAllWindows()

上面的代码可捕捉PiCam生成的视频流,用BGR颜色和灰色模式展示。
注意:我按照组装方式垂直旋转了摄像头。如果你的情况并非如此,那么注释或删除“flip”命令行。
你还可以从我的 GitHub 下载代码:https://github.com/Mjrovai/OpenCV-Object-Face-Tracking/blob/master/simpleCamTest.py

输入下面的命令行,开始执行:

python simpleCamTest.py

要完成该程序,你必须在键盘上按 [ESC] 键。在按 [ESC] 键之前,先鼠标点击视频窗口。

上图展示了结果。

想更多地了解 OpenCV,请查看该教程:https://pythonprogramming.net/loading-video-python-opencv-tutorial/

第4步:人脸检测

人脸识别的最基础任务是“人脸检测”。你必须首先“捕捉”人脸(第 1 阶段)才能在未来与捕捉到的新人脸对比时(第 3 阶段)识别它。

最常见的人脸检测方式是使用“Haar 级联分类器”。使用基于 Haar 特征的级联分类器的目标检测是 Paul Viola 和 Michael Jones 2001 年在论文《Rapid Object Detection using a Boosted Cascade of Simple Features》中提出的一种高效目标检测方法。这种机器学习方法基于大量正面、负面图像训练级联函数,然后用于检测其他图像中的对象。这里,我们将用它进行人脸识别。最初,该算法需要大量正类图像(人脸图像)和负类图像(不带人脸的图像)来训练分类器。然后我们需要从中提取特征。好消息是 OpenCV 具备训练器和检测器。如果你想要训练自己的对象分类器,如汽车、飞机等,你可以使用 OpenCV 创建一个。

详情参见:Cascade Classifier Training

如果不想创建自己的分类器,OpenCV 也包含很多预训练分类器,可用于人脸、眼睛、笑容等的检测。相关的 XML 文件可从该目录下载:haarcascades

下面,我们就开始用 OpenCV 创建人脸检测器吧!

从我的 GitHub 下载文件 faceDetection.py:faceDetection.py

import numpy as np
import cv2
 
faceCascade = cv2.CascadeClassifier('Cascades/haarcascade_frontalface_default.xml')
 
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
 
while True:
    ret, img = cap.read()
    img = cv2.flip(img, -1)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(
        gray,    
        scaleFactor=1.2,
        minNeighbors=5,    
        minSize=(20, 20)
    )
 
    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w] 
 
    cv2.imshow('video',img)
 
    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break
 
cap.release()
cv2.destroyAllWindows()

使用 Python 和 OpenCV 执行人脸检测,上面的几行代码就足够了。注意下面的代码:

faceCascade = cv2.CascadeClassifier(‘Cascades/haarcascade_frontalface_default.xml’)

这行代码可以加载“分类器”(必须在项目文件夹下面的 Cascades/目录中)。然后,我们在在循环内部调用摄像头,并以 grayscale 模式加载我们的输入视频。现在,我们必须调用分类器函数,向其输入一些非常重要的参数,如比例因子、邻近数和人脸检测的最小尺寸。

faces = faceCascade.detectMultiScale(
        gray,    
        scaleFactor=1.2,
        minNeighbors=5,    
        minSize=(20, 20)
    )

其中:
gray 表示输入 grayscale 图像。
scaleFactor 表示每个图像缩减的比例大小。
minNeighbors 表示每个备选矩形框具备的邻近数量。数字越大,假正类越少。
minSize 表示人脸识别的最小矩形大小。

该函数将检测图像中的人脸。接下来,我们必须“标记”图像中的人脸,比如,用蓝色矩形。使用下列代码完成这一步:

for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]

如果已经标记好人脸,则函数将检测到的人脸的位置返回为一个矩形,左上角 (x,y),w 表示宽度,h 表示高度 ==> (x,y,w,h)。详见下图。

得到这些位置信息后,我们可以为人脸创建一个“感兴趣区域”(绘制矩形),用 imshow() 函数呈现结果。使用树莓派终端,在你的 Python 环境中运行上面的 Python 脚本:

python faceDetection.py

你也可以加入诸如“眼睛检测”甚至“微笑检测”这样的检测器。在那些用例中,你需要把分类器函数和矩形框内加入原有的面部识别区域中,因为在区域外进行识别没有意义。
注意,在树莓派上,分类方法(HaarCascades)会消耗大量算力,所以在同一代码中使用多个分类器将会显著减慢处理速度。在台式机上运行这些算法则非常容易。

在我的 GitHub上你可以看到其他的例子:
faceEyeDetection.py
faceSmileDetection.py
faceSmileEyeDetection.py

在下图中,你可以看到我们的结果:

要想深入理解面部识别,可以参考这一教程:Haar Cascade Object Detection Face & Eye OpenCV Python Tutorial

第5步:收集数据

我推荐各位读者可以查看以下两个关于人脸识别的教程:
使用 OpenCV 和 Python 从头实现人脸识别:superdatascience.com
理解人脸识别:thecodacus.com

现在,我们项目的第一步是创建一个简单的数据集,该数据集将储存每张人脸的 ID 和一组用于人脸检测的灰度图。

因此,以下命令行将为我们的项目创建一个目录,目录名可以如以下为 FacialRecognitionProject 或其它:

mkdir FacialRecognitionProject

在该目录中,除了我们为项目创建的 3 个 Python 脚本外,我们还需要储存人脸分类器。我们可以从 GitHub 中下载:haarcascade_frontalface_default.xml

下一步需要创建一个子目录“dtatset”,并用它来储存人脸样本:

mkdir dataset

然后从我的 GitHub 中下载代码 01_face_dataset.py

import cv2
import os
 
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video width
cam.set(4, 480) # set video height
 
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
 
# For each person, enter one numeric face id
face_id = input('\n enter user id end press <return> ==>  ')
 
print("\n [INFO] Initializing face capture. Look the camera and wait ...")
# Initialize individual sampling face count
count = 0
 
while(True):
    ret, img = cam.read()
    img = cv2.flip(img, -1) # flip video image vertically
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_detector.detectMultiScale(gray, 1.3, 5)
 
    for (x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)    
        count += 1
 
        # Save the captured image into the datasets folder
        cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])
 
        cv2.imshow('image', img)
 
    k = cv2.waitKey(100) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
    elif count >= 30: # Take 30 face sample and stop video
         break
 
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

上述的代码和人脸识别的代码非常像,我们只是添加了一个“input command”来捕捉用户 ID(整数)。

face_id = input('\n enter user id end press ==> ')

对于每一个捕捉的帧,我们应该在“dataset”目录中保存为文档:

cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])

对于保存上述文件,我们需要导入“os”库,每一个文件的名字都服从以下结构:

User.face_id.count.jpg

例如,对于 face_id = 1 的用户,dataset/ 目录下的第四个样本文件名可能为:

User.1.4.jpg

在我的树莓派中,该图像可以打开为:

在我的代码中,我从每一个 ID 捕捉 30 个样本,我们能在最后一个条件语句中修改抽取的样本数。如果我们希望识别新的用户或修改已存在用户的相片,我们就必须以上脚本。

第六步:训练

在第二阶段中,我们需要从数据集中抽取所有的用户数据,并训练 OpenCV 识别器,这一过程可由特定的 OpenCV 函数直接完成。这一步将在“trainer/”目录中保存为.yml 文件。

所以,下面开始创建子目录以储存训练数据:

mkdir trainer

从我的 GitHub 中下载第二个 Python 脚本:02_face_training.py

import numpy as np
from PIL import Image
import os
 
# Path for face image database
path = 'dataset'
 
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml");
 
# function to get the images and label data
def getImagesAndLabels(path):
    imagePaths = [os.path.join(path,f) for f in os.listdir(path)]    
    faceSamples=[]
    ids = []
    for imagePath in imagePaths:
        PIL_img = Image.open(imagePath).convert('L') # convert it to grayscale
        img_numpy = np.array(PIL_img,'uint8')
        id = int(os.path.split(imagePath)[-1].split(".")[1])
        faces = detector.detectMultiScale(img_numpy)
        for (x,y,w,h) in faces:
            faceSamples.append(img_numpy[y:y+h,x:x+w])
            ids.append(id)
    return faceSamples,ids
 
print ("\n [INFO] Training faces. It will take a few seconds. Wait ...")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
 
# Save the model into trainer/trainer.yml
recognizer.write('trainer/trainer.yml') # recognizer.save() worked on Mac, but not on Pi
 
# Print the numer of faces trained and end program
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))

确定在 Rpi 中已经安装了 PIL 库,如果没有的话,在终端运行以下命令:

pip install pillow

我们将使用 LBPH(LOCAL BINARY PATTERNS HISTOGRAMS)人脸识别器,它由 OpenCV 提供:

 recognizer = cv2.face.LBPHFaceRecognizer_create()

函数“getImagesAndLabels (path)”将抽取所有在目录“dataset/”中的照片,并返回 2 个数组:“Ids”和“faces”。通过将这些数组作为输入,我们就可以训练识别器。

recognizer.train(faces, ids)

在训练过后,文件“trainer.yml”将保存在我们前面定义的 trainer 目录下。此外,我们还在最后使用了 print 函数以确认已经训练的用户面部数量。

第7步:识别器

这是该项目的最后阶段。这里,我们将通过摄像头捕捉一个新人脸,如果这个人的面孔之前被捕捉和训练过,我们的识别器将会返回其预测的 id 和索引,并展示识别器对于该判断有多大的信心。

让我们从 GitHub 03_face_recognition.py 上下载第三阶段的 python 脚本。

import cv2
import numpy as np
import os
 
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer/trainer.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
 
font = cv2.FONT_HERSHEY_SIMPLEX
 
#iniciate id counter
id = 0
 
# names related to ids: example ==> Marcelo: id=1,  etc
names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']
 
# Initialize and start realtime video capture
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video widht
cam.set(4, 480) # set video height
 
# Define min window size to be recognized as a face
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
 
while True:
    ret, img =cam.read()
    img = cv2.flip(img, -1) # Flip vertically
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
     
    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor = 1.2,
        minNeighbors = 5,
        minSize = (int(minW), int(minH)),
       )
 
    for(x,y,w,h) in faces:
        cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
        id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
 
        # Check if confidence is less them 100 ==> "0" is perfect match
        if (confidence < 100):
            id = names[id]
            confidence = "  {0}%".format(round(100 - confidence))
        else:
            id = "unknown"
            confidence = "  {0}%".format(round(100 - confidence))
         
        cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
        cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1) 
     
    cv2.imshow('camera',img)
 
    k = cv2.waitKey(10) & 0xff # Press 'ESC' for exiting video
    if k == 27:
        break
 
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()

这里我们包含了一个新数组,因此我们将会展示“名称”,而不是编号的 id:

names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z', 'W']

所以,如上所示的列表,Marcelo 的 ID 或索引为 1,Paula 的 ID 等于 2。

下一步,我们将检测一张人脸,正如我们在之前的 haasCascade 分类器中所做的那样。

id, confidence = recognizer.predict(gray portion of the face)

recognizer.predict () 将把待分析人脸的已捕捉部分作为一个参数,并返回其可能的所有者,指示其 id 以及识别器与这一匹配相关的置信度。
注意,如果匹配是完美的,置信度指数将返回“零”。

最后,如果识别器可以预测人脸,我们将在图像上放置一个文本,带有可能的 id,以及匹配是否正确的概率(概率=100 – 置信度指数)。如果没有,则把“未知”的标签放在人脸上。

在这张图像上,我展示了一些由该项目完成的测试,其中我也使用图像验证识别器是否有效。

第 8 步:结语

我希望该项目能帮助其他人发现更好玩的项目,也希望有助于各位读者实现自己的人脸识别应用。

更多详细的代码请查看 GitHub 地址:https://github.com/Mjrovai/OpenCV-Face-Recognition
(原文来自hackster,由机器之心编译)

本文来自:树莓派实验室

PiSwitch:用树莓派制作 Switch 游戏机

这是一件用树莓派制作的形似 Switch 的游戏机,作者 cfoote7 写道:
感谢树莓派基金会富有创意的开发人员、RetroPie 同样重要的Kodi。最后,我要感谢 Nintendo 让我做这个逆向工程,我可不太愿意玩它家的 Switch 主机。

这款主机将集复古游戏模拟器、媒体中心、微型电脑等多种用途于一身的,制作过程比较复杂,还是让我们看一组制成品的视频先睹为快吧!

使用预览

游戏视频运行 Debain 系统变身微型电脑

运行 Kodi 系统变身媒体中心

游戏视频

第1步:采购准备工作

你将需要以下工具:

  • 烙铁+焊料+助焊剂
  • 热熔胶枪
  • 3D打印机或借助3D打印服务商
  • 一套完整的微型螺丝刀套件
  • 精密钻头工具或带3/16钻头的钻头套件

耐心点,下面才是重点!

部件包括:

  • 树莓派官方7寸屏幕
  • Kingwin 80 件什锦笔记本更换螺丝套件或(各种大小和类型的螺丝)
  • 26 awg 电线
  • 1/8英寸大小立体声插孔带开关
  • 迷你金属音箱
  • 微型电源开关
  • 充满电的6600毫瓦电池
  • Joy-Con控制器(推荐使用充电器)
  • 树莓派3B(内置蓝牙和WiFi)
  • PAM8302 2.5W 音频功放
  • PowerBoost 1000C

3d打印的外壳(所需文件在这里下载)
Pi3SuperAwesomePortable_brackets.stl
SwitchPiScreen_v2.stl
Pi3SuperAwesomePortable_Case_2mm.stl

可选项:

  • 树莓派官方摄像头二代

第2步:将音频接口焊接到树莓派上

首先从树莓派开始,将26 awg 电线与树莓派焊接:
我会在音频接口附近将红色的左声道焊接到pp26(感谢树莓派基金会标记的焊盘)将黑色焊接到pp24。
右声道是黄色导线,并将其焊接到音频接口的左上角引脚。
我建议留下额外的8-10厘米长的电线,你可以将它们剪下来,或者卷起来留用。因为我的项目经常被拆开并重建或重新使用。我非常喜欢这个特殊的1/8插孔。我之所以选择它,是因为能清晰的从顶部看到并彻底的了解它的工作原理。

焊接音频接口(引脚见上图):
从树莓派上取下红色导线并将其焊接到1/8插孔上的针脚2上。
从树莓派上取下黄色导线,并将其焊接到1/8插孔上的针脚5上。
取下黑色导线,再拧8-10厘米长的黑色导线,然后在1/8插孔上焊接到针脚1上。
将8-10厘米长的红色导线焊接到1/8插孔上的针脚3上。
你现在应该有一个音频接口连接到树莓派,如果你播放声音,然后插入耳,就会很清晰地听见声音。我建议将导线用热熔胶粘合在树莓派的底部,同时底部的接口能固定细线,并保护它们免受损坏和短路。

第3步:焊接电源板和开关

PowerBoost 1000C 满足您所有的锂充电需求。

然而不幸的是,这个小东西虽然非常棒,但并不能输出足够的电力来运行Pi-Switch。但它的确是非常不错的充电电池,这个电池能为树莓派提供足够多的电量,使屏幕和音频供电大约2-3个小时。我会将电源保持开启,以便耗尽电池电量,这就意味着您需要直接插入电源。我仍在努力寻找更好的解决方案。

电源线:
首先看上图,你会注意到3个黑色圆圈和3个红色圆圈。
你猜到了!焊接3个25厘米的黑色导线和3个25厘米的红色导线到PowerBoost上标记的相应位置。

开关(电源开关,不是 Nintendo):
将一根右边或左边的腿从开关上切下,然后用5厘米的电线焊接到残缺的电源开关的备用引脚上。
焊接其中一条电线,切换至PowerBoost,剩下的电线连接至PowerBoost板。
热熔胶便宜,快捷,简单。我建议将连接到Power Boosted Board的每根电线上涂上热熔胶。

第4步:扬声器和音频板以及耳机插孔(将它们连接在一起)

这一步我们将这些组件组合在一起。

焊接扬声器:
如图所示,将每一根导线焊接到扬声器上的每个垫上。热收缩太方便了,如果你像我一样喜欢使用热熔胶!

焊接音频板:
拿起你的PAM8302,看看它的说明。如图所示,在电路板4-8欧姆的一侧,将扬声器电线焊接到两个中心垫上。

焊接音频的电源:
从PowerBoost板上取下其中一根红色电源线和一块接地板,并将红色电线焊接到PAM8302上的vin上,将黑色电线焊接到PAM8302上的gnd上。

焊接耳机至PAM8302:
从耳机插孔取出红线,并将其焊接到PAM8302的A+上。
从耳机插孔取出黑色线,并将其焊接到PAM8302的A-上。

焊接树莓派:
这有一张树莓派的图片。从PowerBoost上取出一根黑线将其焊接到树莓派图片上的黑点。
从PowerBoost上取出一根红线将其焊接到树莓派图片上的红点。

测试:
请小心确保剩余的黑线来自PowerBoost,和来自PowerBoost的红线不会触及任何东西。然后装上电池并翻转开关。如果所有部件都正确连接,则应在充电板上的指示灯上点亮指示灯,如果扬声器噪音太大,可能会听到扬声器发出轻微的嗡嗡声,以至于可能出现焊接问题。

第5步:组装

除了LCD和可选的PI相机之外,我们现在应该已经安装了所有东西。在之前的图片中,你会看到如何嵌入树莓派本身。这非常简单,现在你可以拿出那个80件什锦笔记本更换螺丝套件,找到一些比树莓派厚一到两毫米的螺丝,然后将它们拧入软印刷塑料中。推荐使用PLA。应该有两个合适的夹子来安置树莓派,并且在相反的角落有可以穿线的孔。电源板也是如此。上面的图片展示了电源板的组装。

现在将开关穿过电源板上方的小孔。用镊子或手指从外面抓住开关。如图所示,轻轻地拉开开关以防止其掉入箱内,在开关背面放置一些热熔胶。一旦胶水冷却,请检查开关是否便于使用。如果粘胶不好,请再试一次。在树莓派和PowerBoost之间钻一个3/16英寸的孔,也可以只是钻出一个孔。它应该在树莓派的usb端口的一侧。将耳机插孔穿入孔中并粘合到位。
最后,将扬声器电池和音频板粘合到位,如上图所示。我将扬声器放在电池下面的塑料下面,我把它直接塞在PowerBoost板后面。然后,我将电池粘在3D打印机箱的两侧。最后,我把扬声器放大器粘在电池的顶部。

所以,如果你已经做好了这一切,那么你现在应该已经将树莓派、PowerBoost、PAM8302、扬声器、电源开关和电池都安装在树莓派盒的背面。另外应该还有一个25厘米的黑线和一个25厘米的红线留下。

第6步:添加屏幕和配件

你几乎已经完成了这个相当复杂的组装。现在拿出一些6毫米长的螺丝和螺纹侧杆, 如上图所示,将它们拧入屏幕上的螺丝孔。如果屏幕不是连成一排的,为了更适合使用,可能会需要颠倒过来。看看图片,你可能会注意到我的成型线连接到了我的屏幕上。实际上,我将pin header放在我的PowerBoost上,而不是直接焊接。如果你没有提前看这些步骤的话,你可能正在焊接电线。如果我不特意提醒的话。我更喜欢pin header,因为它可以迅速、简单的修改,而我的创作始终处于不断变化的状态。

使用剩余的电线:
将剩余的红线从PowerBoost焊接到屏幕上的vin引脚。
将剩余的黑线从PowerBoost焊接到屏幕上的gnd引脚。

连接相机(可选):
将相机电缆插入相机板。
如图所示将电缆插入树莓派中。
通过以太网插孔翻转相机。
使电缆平整并粘合到位。

附加屏幕宽带线:
如图所示将带状电缆插入树莓派。
如果您看上图,它会显示我在连接带状电缆后如何将背面板向下翻转到位。
最后,将后面板上的四颗螺丝拧入屏幕背面的支架中,然后完全组装。

第7步:制作树莓派软件镜像

步骤 1)
给树莓派接上键盘,通电。
转到此网站并按照安装步骤操作:(仅将您的键盘设置为临时控制器)
https://github.com/RetroPie/RetroPie-Setup/wiki/First-Installation

步骤 2)
您可能会听到恼人的嗡嗡声(现在可以忽略,我们很快就会修复)
按照以下步骤通过ReroPie菜单设置wifi:
RetroPie / settings> raspi-config> interfacing options >SSH > Yes > Ok > Finish > Retropie Setup > Configuration Tools > wifi>(设置你的wifi)> exit>

步骤 3)
安装 Pixel:
raspbiantools > Install Pixel Desktop Environment > yes > (等一会) > ok (to flash player) > (稍等时间久一点) > ok > cancel > back >

步骤 4)
安装 Kodi:
Manage Packages > Manage Optional Packages > Kodi > Install from binary > (wait a while) > back > back > back>

步骤 5)
注册并连接您的 JoyCons 手柄:

Configuration /Tools > bluetooth > Register and Connect (同时按下右侧joy-con上L和R之间的小按钮) > choose Joy-Con (R) > NoInputNoOutput > (wait) > ok > ok

步骤 6)
用Joy-Con(L)重复步骤5。

步骤 7)
cancel > back > exit > (start button) > quit > quit emulation station> yes

步骤 8)
运行以下命令:

sudo apt-get update && sudo apt-get upgrade && sudo rpi-update
sudo reboot

步骤 9)
输入以下内容:

wget https://raw.githubusercontent.com/cfoote7/PiSwitch/master/setup.sh
sudo chmod 777 setup.sh && sudo chmod a+x setup.sh
./setup.sh

更新:
我已经添加了一个控制器连接菜单,屏幕上会显示是否连接到两个joy-cons。还增加了单人/双人玩家模式选择菜单。在完成第一boot时,你将可以用“+”和“-”按钮连接你的控制器,点击下一步,点击RetroPie,然后选择单人玩家模式。

备注:
pywx.py 是我的触摸屏启动的选择菜单,实际上它并不是启动选项,所有这些选项都储存在raspbian jessie下。我计划添加一个更简单的方式将控制器在启动时与此菜单配对。请您随时查看更新信息。如果您进行了任何改进,请特别注意是否可以构建此功能并告知我。我非常乐意为此提供合作服务。请检查我的存储库,我会更新在 https://github.com/cfoote7/PiSwitch

via Cherry 译。

本文来自:树莓派实验室

 

 

树莓派超频全攻略

树莓派超频,基本上说,就是调整几个设备参数,然后让树莓派硬件“加满油”工作,而这个过程则需要一定的硬件知识以及特殊技能。不过有一点你需要注意,超频对硬件来说是存在一定风险的,但是本文也会告诉你如何去避免这些风险。

超频风险和警告提示

目前树莓派3官方还不支持超频,所以你的树莓派设备可能会有损坏的风险,这一点我们可不负责,所以你需要考虑清楚,“盈亏自负”。

超频可能会让硬件温度超过90摄氏度,情况好一点的话,就是系统或软件崩溃,情况不好的话,可能会损坏CPU或内存芯片。所以树莓派上的重要芯片都需要安装散热器,强烈建议大家安装高功率散热风扇。

再次提示:如果没有安装有效的散热设备,请千万不要按照本文所介绍的方法超频。

硬件要求

如果你想超频树莓派,你至少需要下列三种关键硬件:

1.   树莓派:本文将使用Raspberry Pi 3 Model B V1.2,运行Raspbian GNU/Linux8(jessie).

2.   供电电源:强烈建议大家使用稳定的电源,超频后的树莓派3大概需要至少1.5A,所以电源至少要能够提供2A电流。

3.   散热设备:为了防止树莓派硬件(主要是芯片)被烧坏,我们必须安装散热风扇;

重要提示-开始之前请使用下列命令更新系统:

$sudo apt-get update && sudo apt-get dist-upgrade

安装“sysbench“工具之后,你就可以随时查看系统性能了。安装命令如下:

$sudo apt-get install sysbench

下图中包含了超频所需的全部组件:

硬件清单:

1.   RaspberryPi 3;

2.   5V/2.5A的供电电源;

3.   散热风扇;

4.   三个散热片;

5.   底座;

安装完成后的情况如下:

超频前的检查工作

在开始超频之前,我们一定要检查设备状态。

监控CPU频率

为了了解CPU的当前运行频率,我们需要读取出从/sys/devices/system/cpu/cpu0/cpufreq/目录中读取出cpuinfo_min_freq、 cpuinfo_max_freq和cpuinfo_cur_freq这三个文件:

cpuinfo_min_freq– 空闲模式下的最小频率

cpuinfo_max_freq– 最大工作频率

cpuinfo_cur_freq– 树莓派当前的运行频率

监控CPU温度

我们可以运行vcgencmd measure_temp命令以及while循环来监控CPU每秒钟的温度变化:

$while true ; do vcgencmd measure_temp ; sleep 1 ; done

循环会一直运行下去,直到我们按下 CTRL+C。

设置默认速度

树莓派的CPU配置在空闲模式下的默认速度为:

arm_freq=600MHz
core_freq=250MHz

如果进程在运行的话,频率就会变成:

arm_freq=1200MHz

为了防止空闲模式被破坏,我们还需要修改/boot/config.txt

force_turbo=1(警告!修改该参数将会失去保修)
boot_delay=1

重启设备,再次检查当前的运行频率,现在应该是1200000 KHz了。

性能测试(未超频)

首次进行性能测试的命令如下:

$sysbench --test=memory --cpu-max-prime=2000 --num-threads=4 run

输出结果如下所示:

待会儿超频之后我们再对比一下性能情况。

树莓派3超频攻略

超频选项

需要设置的超频参数都在/boot/config.txt文件中,选项如下:

1.   CPU超频:修改“arm_freq”参数-ARM频率,单位为MHz。

2.   GPU超频:修改“core_freq”参数-GPU处理器核心频率,单位为MHz。

3.   内存超频:修改“sdram_freq”参数-SDRAM频率,单位为MHz。

4.   内存扩展:使用ZRAM。

5.   额外超频参数“Over_voltage”:调整ARM/GPU核心电压,只有指定了“force_turbo” 或“current_limit_override”参数之后,才可以将电压调整为6V以上。

6.   额外超频参数“Force_turbo”:这个参数可以禁用动态cpufreq驱动器。

修改参数之前,别忘了备份/boot/config.txt。

不同型号的树莓派在制作过程中可能会有一定的参数偏差,所以我们需要进行多次测试才能确定自己设备的最佳值。

遇到问题怎么办?

如果发现超频参数修改之后设备无法启动,你可以重启时按住“shift“键,这样就可以暂时禁用所有的超频参数了,并允许你在启动之后重新修改设置。

超频算法

这份算法可以调整CPU、GPU和内存的频率,以实现更好的性能。

树莓派3的默认值如下:

arm_freq=1200
gpu_freq=400
core_freq=400
sdram_freq=450
over_voltage_sdram=0

接下来,将下列参数写入到/boot/config.txt文件,然后重启设备:

arm_freq=1300 
gpu_freq=500 
sdram_freq=500 
over_voltage_sdram=0

如果设备运行正常的话,我们就可以尝试下一个配置:逐渐增加arm_freq的值,到1500为止。保存,然后重启。

如果设备无法运行或运行不稳定的话,你可以逐渐调高over_voltage_sdram的值,直到设备能够稳定运行为止。如果调整over_voltage_sdram参数救不了你的话,你可以尝试调低arm_freq的值,每次修改之后别忘了重启设备。

使用ZRAM超频

这种方法涉及到设备内部内存的扩展,这里需要使用到ZRAM以及内部内存压缩。ZRAM使用了LZ4以及LZO压缩算法,LZO是默认的,它可以创建一个块设备,并当作通用RAM磁盘来使用。

如何加载ZRAM?由于ZRAM已经整合进Linux内核了,我们只需要使用命令“sudo modprobe zram“来加载该模块即可。我们可以使用命令”sudolsmod | grep zram“来查看ZRAM模块的运行情况:

如果我们想用ZRAM来优化树莓派的话,我们可以从这个【GitHub】库中获取zram.sh脚本。该脚本可以给每一个CPU核心创建一个额外的压缩RAM交换磁盘并激活,除此之外不需要任何其他的配置操作了。

你可以使用下列命令下载脚本:

sudo wget -O /usr/bin/zram.sh https://raw.githubusercontent.com/novaspirit/rpi_zram/master/\zram.sh

然后制作可执行文件:

在激活ZRAM之前先查看内存信息,“free -h“和”swap -s“命令表明我们树莓派已激活的交换空间仅有100MB。

接下来,使用下列命令运行ZRAM:

sudo zram.sh

该脚本将为每一个CPU核心创建大小为232MB的交换空间,总共大小约为1GB。再次运行“free -h“和”swap-s“命令后,我们看到总的交换空间(4个分区)已经增加到了1GBRAM:

为了让树莓派在启动之后自动运行ZRAM,我们还需要修改/etc/rc.local文件(添加红圈中的代码:/usr/bin/zram.sh &):

重启设备以确认修改成功。

性能测试(已超频)

设置完成之后,运行下列命令进行性能测试:

sysbench--test=memory --cpu-max-prime=2000 --num-threads=4 run

结果如下:

大家可以看到,超频之后所有的性能参数值都有所提升,大家可以跟之前的测试结果对比一下。

如何恢复原状?

如果你不想超频的话,你只需要把之前备份的/boot/config.txt文件重新复制到/boot目录中,并重写config.txt文件即可。当然了,你还需要把“/usr/bin/zram.sh&”从 /etc/rc.local文件中删除。重启之后,一切就恢复原样了。

参考资料

1.   https://eltechs.com/run-plex-media-server-on-raspberry-pi/

2.   https://eltechs.com/run-spotify-on-raspberry-pi/

3.   https://eltechs.com/run-dropbox-on-raspberry-pi/

4.   https://eltechs.com/run-teamspeak-3-server-on-raspberry-pi/

5.   https://eltechs.com/run-google-chrome-on-raspberry-pi/

6.   https://eltechs.com/netflix-raspberry-pi/

7.   https://eltechs.com/retropie-raspberry-pi-retro-gaming-machine/

* 参考来源:eltechs,FB小编Alpha_h4ck编译,转载来自FreeBuf.COM

VOIP服务器-树莓派电话系统

利用 Asterisk 来实现一个低成本的电话系统

在研究了一些为小企业提供VoIP(Voice over Internet Protocol)和IP电话服务,包括支持新趋势 UC(统一通信)的技术解决方案之后,我个人认为用树莓派提供一个非常低成本的解决方案是完全可行的。相对于100美元的投资和一个专用的 VoIP/UC 服务器解决方案,树莓派和相应配件在成本方面的优势是无法比拟的。

树莓派的解决方案是通过在 Raspbian 系统上运行 Asterisk VoIP/UC 软件来实现的。这个开源解决方案提供了高度灵活的配置项,当然也可以用于许多不同的领域和应用。

本文说明了 VoIP/UC 的解决方案并不一定是高风险的,在实施的时候也不一定是需要很高投入的。

简介

在过去的几十年中,电话技术发展迅速,从模拟通信迁移到了基于VoIP的数字通信和IP电话。这也让统一通信成为了可能,统一通信是对实时通信服务,例如即时消息(聊天),电话,数据共享,视频会议,语音识别等和非实时通信服务,例如语音信箱,电子邮件、短信和传真等的集成。统一通信并不是指某一个单一的产品,而是一系列提供了一致的,统一的,跨多个设备和媒体类型的用户界面和用户体验的产品。(http://en.wikipedia.org/wiki/Unified_communications)

VoIP 是利用某个网络协议,比如SIP协议 (Session Initiation Protocol) 和 RTP协议 (Real-time Transport Protocol) 等,从而实现通过因特网来传输声音。

基础

要实现一个 VoIP/UC 解决方案,系统必须满足各种行业标准,而且网络设备也必须能够区分出对语音视频数据和其他类型数据的使用。

基本组件

本方案对硬件和软件的要求很简单。你需要做的可能只是下载软件而已。

硬件:

  • 树莓派B或者B+
  • 4 GB SD卡 (最低配置)
  • 1A 电源
  • 网线
  • 可选的 SIP 电话或者 SIP适配器(本文使用 Dlink DPH-150SE)

软件:

  • Raspbian
  • Asterisk 通信软件
  • LinPhone 虚拟电话软件 (支持 iOS, Android, Blackberry, Linux, Windows and OSX)。你可以通过下面链接下载。 http://www.linphone.org

安装

初始安装设置的时候,你可能需要使用一个USB键盘和鼠标连接到 Raspberry Pi 上,再连上一个显示器。配置成功以后,树莓派就可以不需要这些而自己运行了。

获取 Asterisk 软件最好的和最容易的方法是从这个网站 (http://www.raspberry-asterisk.org/downloads)下载最新的 SD 卡映像文件,它是一个预装了 Asterisk 通信软件和 FreePBX 图形用户界面的 Raspbian 系统。该映像文件是通过在这个网页上(http://www.raspberrypi.org/documentation/installation/installing-images/)的步骤被写到SD卡上的。

当系统启动后,用 root 身份和 raspberry 密码登陆。如果愿意,你也可以远程登陆树莓派系统。在 Windows 上安装 PuTTY SSH 客户端并用 root@raspbx 连接树莓派。如果是苹果的 Mac,只需简单的打开终端,输入命令 SSH root@raspbx.local 。你可能以后会想禁止通过 SSH 登陆 root 用户,因为这有可能造成一个安全漏洞。当你登录系统以后,你需要运行的第一个命令是:
raspbx-upgrade

这个命令将更新所有的软件到最新版本,包括 Raspbian 和 Linux 内核。

接下来你需要做的是配置静态IP地址。你需要在你的路由器或者猫上指定你想使用的静态IP地址,网络掩码和网关。命令:
ifconfig

将提供你当前的IP地址,网络掩码。你的新的静态IP地址的前三个字节应该跟你当前的IP相同,最后一个字节必须在你的路由器当前已使用的动态IP地址范围之外。如果想查找网关地址,请输入:
netstat -r

通过下面的命令编辑 interface 文件:
nano /etc/network/interfaces

编辑好的 interface 文件应该看起来跟下面截图中的一样。

注意你需要将 eth0 那一行上的 “dhcp” 替换为 “static”, 并确保你使用的是 <Tab> 键来达到需要的缩进。

保存这个文件以后,重启树莓派让新的网络设置生效。现在开始,你就可以使用新的静态IP或者 raspbx 主机名了。例如我现在就可以使用 PuTTY 通过静态IP来连接树莓派: root@172.31.15.11 。

Asterisk的配置

我们现在要通过 FreePBX 的图形用户界面来配置 Asterisk 软件。这样可以让整个配置过程变得简单和容易。 FreePBX 是已经在我们下载的那个映像文件里预装好了的软件。
如下所示的是一个示例架构图:

要运行 FreePBX, 请打开浏览器并在地址栏输入 http://raspbx 或者树莓派的静态 IP 地址。(对于苹果的 Mac,你需要输入 http://raspbx.local)。这样就打开了 FreePBX 的管理界面。

这里有三个选项:

  1. FreePBX Administration 用于配置 Asterisk
  2. User Control Panel 供用户调整他们的个人设置
  3. Get Support 将打开 FreePBX 的官方网站

点击 FreePBX Administration, 默认的登录名是 admin,登陆密码也是 admin。这个软件的菜单有多种选项,包括分机(Extensions),会议(Conferences)和响铃组(Ring Groups)等。请点击分机(Extensions)。

由于当前没有分机存在,所以你将添加一个新的分机。Device 选项请选择 Generic SIP Device,然后点击提交(Submit)进入下一个页面。这个页面也有很多的选项,但我们只需要设置用户分机号码为 300,显示名称为 Walberto 和密码为 ext300。单击 Submit 添加该扩展。

在屏幕的右边,点击 300 来查看你刚刚添加的分机。验证端口(port)选项被设置为 5060。点击 Submit 提交,然后点击那个红色的 Apply Config 按钮来保存所做的更改。

重复这个过程添加其它你需要的分机号,在这里我添加了 301 和 302 分机。

现在,我们需要配置 IP 电话。这个过程根据你的电话设备的型号而不同,在这里我们将使用 Dlink DPH-150SE 作为一个示例。最重要的设置是禁用 DHCP 选项,确认 SIP 电话端口号为 5060,还有注册的服务器是你的树莓派的 IP 地址。在后面的章节中,我们将通过 Proxy 选项来启用服务器注册。

对于 SIP Account 设置选项,我们需要输入之前通过 FreePBX 添加分机时使用的数据。Authentication User Name 就是之前添加的分机号码,而 Authentication Password 就是我们之前设定的那个密码(即ext300)。

虚拟电话配置

启动 Linphone 并在 Options 菜单中选择 Preferences。确认网络设置如下图所示。

在 Multimedia settings 选项中, 确认 Echo cancellation 被选上。在 Manage SIP Accounts 选项中输入你的显示名称。在我的例子中,虚拟电话的分机号为302, 所以用户名也为 302。由此而生成的 SIP 地址为<sip:302@172.31.15.7>。单击 Add 按钮在 Asterisk 上注册该分机的帐号。

按照下图所示,输入你的 SIP identity 和 SIP Proxy address(即你的树莓派的 IP地址)。

然后你将被要求输入密码。对于302分机,我设定的密码是 ext302。单击确定,注册就完成了。

通过 FreePBX 和 Asterisk 可以实现各种服务,如会议室,IVR(交互式语音应答),呼叫组等,还可以通过普通的PSTN电话,SIP中继线或互联网进行呼入和呼出。

未来

VoIP和互联网通讯的发展正在推动统一通信系统融合成一个整体的系统和环境。 FreePBX 和 Asterisk 是一个非常好的例子,它演示了如何用很低的成本来实现复杂的通讯系统。

作者:树莓派杂志中文版
链接:https://www.jianshu.com/p/4789d030fee3
來源:简书

树莓派3刷LEDE(OpenWRT)打造便携个人无线上网

前往 LEDE 官网下载固件并验证:

https://downloads.lede-project.org/releases/17.01.4/targets/brcm2708/bcm2710/lede-17.01.4-brcm2708-bcm2710-rpi-3-ext4-sdcard.img.gz

注:bcm2710 是专为树莓派3准备的。

淘宝购买树莓派硬件:

刷机软件:

SD卡烧录工具:Win32DiskImager (windows)

SSH连接工具:MobaXterm (windows)

刷入LEDE系统

使用 Win32DiskImager 烧录 LEDE 系统镜像到 SD卡

安装SD卡到树莓派,开机。

网络配置

用一根网线连接笔记本和树莓派,设置电脑的IP为自动获取。树莓派的默认IP为192.168.1.1

SSH 登陆,并修改 root 密码

ssh root@192.168.1.1

passwd

修改 /etc/config/network 配置文件,调整 lan IP为和路由器不冲突的其他IP,增加 wan 设置

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'
config globals 'globals'
        option ula_prefix 'fdd4:e89f:6414::/48'
config interface 'lan'
        option type 'bridge'
#       option ifname 'eth0'
        option proto 'static'
        option ipaddr '192.168.88.1'
        option netmask '255.255.255.0'
        option ip6assign '60'

config interface 'wan'
        option proto 'dhcp'
        option ifname 'eth0'

修改 /etc/config/wireless 配置文件,开启无线 AP

config wifi-device 'radio0'
        option type 'mac80211'
        option channel '11'
        option hwmode '11g'
        option path 'platform/soc/3f300000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1'
        option htmode 'HT20'
        option disabled '0'

config wifi-iface 'default_radio0'
        option device 'radio0'
        option network 'lan'
        option mode 'ap'
        option ssid 'LEDE-WiFi'
        option encryption 'psk2'
        option key 'abc12345'

重启树莓派

reboot

用一根网线连接树莓派和路由器的 LAN 口,WiFi 连接到 LEDE-WiFi 网络,重新连接 SSH

更新软件包安装LuCI web界面

opkg update 
opkg install luci-ssl

浏览器访问 https://192.168.88.1 进入管理界面

安装软件包

安装中文包

opkg install luci-i18n-base-zh-cn 
opkg install luci-i18n-firewall-zh-cn

安装主题包

opkg install luci-theme-material

进入System > Software 搜索 luci-theme-material 主题包并安装

本文转自:小莱沃

用 Ncdu 分析树莓派的磁盘用量

使用树莓派部署、下载了很多软件和文件之后,你可能经常需要清理一下,这时要去搜索占用 SD 卡空间的都是哪些东西。树莓派 Raspbain 系统有一个很有用的工具叫 Ncdu,可以列出可以清理的磁盘空间占用。下面树莓派实验室给大家介绍。

安装 Ncdu 磁盘分析器

Ncdu 已经被 Raspbian 默认安装好了,如果没有则需要手工安装,可以用下面的命令。

sudo apt-get update
sudo apt-get install -y ncdu

运行 Ncdu

终端输入命令运行:

ncdu

它会给出当前目录下的磁盘占用情况。

你可以切换到你想清理的目录下面运行 ncdu 命令,或者像下面这样指定某个路径查看:

ncdu /home/pi
ncdu /

建议在指定目录时尽量选择一个比较合理的目录结构,如果目录下文件和子目录太多则需要等待 Ncdu 分析很久。

你可以使用方向键、回车键选择或进入下一层目录。

Ncdu 快捷键

这里提供了快捷键列表。按下“?”可进入。

快捷键划重点:

  • ? – 显示帮助界面
  • up, down j, k – 上下移动光标
  • right, enter, l – 打开所选目录
  • left, <, h – 返回上层目录
  • n – 按照文件名排序(再按一下倒序排列)
  • s – 按照文件大小排序(再按一下倒序排列)
  • C – 按照项目数排序(再按一下倒序排列)
  • a – 切换磁盘用量显示
  • d – 删除所选的文件或目录
  • i – 显示所选项的更多信息
  • r – 刷新/重新计算当前目录
  • b – 在当前目录下打开 shell

这里列出了界面上符号的释义:

总而言之,用了这个工具之后,手动清理磁盘空间不再繁琐了,希望对您有所帮助。

原文,翻译:树莓派实验室,转载本译文请保留此声明。

本文来自:树莓派实验室

这个人改造了自己的桌子,让自己的 Google Home 用上 “实体专辑”

相信,还在买 CD 或者黑胶的用户其实还有不少。

爱范儿(微信号:ifanr)在之前谈黑胶的时候就已经提到,现在有不少年轻用户还会追黑胶唱片。他们的着眼点并不在体验传统的味道上,而是觉得收集黑胶或者其他实体专辑是一种支持歌手出唱片或提升“仪式感”的行为。

 

虽然不怎么听,但买起来也不会少。

确实,现在要听个实体专辑确实也不容易。黑胶的话经不起折腾,听 CD 也不方便。而且现在的人已经习惯了那种以单曲、EP 为主的音乐消费模式,很少人能够坚持把一张专辑完完整整听完的。

OLYMPUS DIGITAL CAMERA

所以在声音体验也没有差太多的前提下,与其去不断切歌、换碟,倒不如直接用流媒体来得方便。

但其实,现在有人还想去玩“实体专辑”。GitHub 上有一位用户,就通过树莓派做了一个识别感应器,让自家的 Google Home 用上“实体专辑”。

 

根据 The Verge 的报道,这位来自 GitHub 上的用户叫“hoveeman”,他将一个射频识别读卡机和树莓派 Raspberry Pi Zero 连接起来,并开发了一套专用的程序。安装上这套程序后,树莓派能够给家中的 Google Home 发出指令,让它播放相应的专辑。

在这套组合中,射频识别读卡器 RFID 模块的任务就是用来识别“实体专辑”。

这些“实体专辑”,其实是 hoveeman 自己做的一些小卡片。小卡片的表面印着专辑封面、名称和表演者,卡片内部则呆在了一块小型识别芯片。当用户将芯片放到 RFID 模块上,模块就能够识别出相应的信息,传输到 Raspberry Pi Zero 上。电脑处理后,就会发送的 Google Home 上,让它播放相应的专辑。

这个模块能够隐藏在家居产品当中,不管是木桌还是凳子,只要不阻碍 RFID 识别的,都能够藏在里面。虽然这套设备带来的解决方案有点“多此一举”,但现在看起来有点意思。至少,它比你经常换 CD 来得方便。

现在,Hoveeman 将这套解决方案都上传到 GitHub 上。你可以在这个主页上查到它用过的设备和代码,自己做一套相同的出来。

(Hoveeman 整套方案的内容物)

这个其实有点像之前在那个用 RFID 来控制 Spotify 的方案,那个方案也是用识别卡片来让智能设备播放 Spotify 中的专辑或特定播放列表,做法和实现目标基本上没有什么大分别。

这些方案对于开发者来说,也都是自娱自乐的东西而已。

毕竟,现在的人确实也不怎么喜爱这种消费方式。他们只需要一个简单的听歌方案,而流媒体服务正好能够给他们最简单直接的体验,有这个来确保基本需求之后,其他东西也不重要。

 

安装Pi-hole,让树莓派为你过滤家中广告

最近在使用DietPi这个魔改版Raspbian系统时意外的发现了这个神奇的软件(软件主页:https://pi-hole.net/,正如标题所说,它可以帮你过滤整个家中的广告,但不需要繁琐地针对每台设备进行设置,算是对非智能路由及低性能路由无法过滤广告的一种解决方案。

下面就讲解一下具体的安装方法咯。

注:同样适用于其他Linux设备

0.开始之前

首先你需要为你的树莓派安装好系统,然后你可能需要针对自家的网络环境为你的树莓派设置好静态IP,不同的路由器设置方法有一定差别,具体方法自行百度(关键词:路由品牌 静态IP)。

例如我刷了LEDE的路由器的设置在这里:

不过近几年的路由器大多会针对不同的设备设置固定的IP地址,所以如果你确定自己树莓派的IP地址不会变动,不设置也是OK的。

1.安装Pi-hole

Pi-hole的安装过程比较简单,只需在终端中输入一条命令即可:

curl -sSL https://install.pi-hole.net | bash

安装过程中你可以喝杯咖啡,看会儿书,刷会儿微博,直到你进入这个界面:

一路Enter,直到这里:

选择其中一个DNS提供商,或者选择最后一项自定义:

选好之后接着一路Enter,然后你继续可以喝杯咖啡,看会儿书,刷会儿微博,直到这里:

这时就已经安装完成了,访问上面给出的网址,输入密码即可进入后台。

如果需要修改密码,在终端中输入:

pihole -a -p newpassword

 

2.配置路由

光设置好树莓派是没卵用的,毕竟我们要过滤的是整个局域网的广告,所以我们要针对路由器进行配置。

Pi-hole采用的是使用本地DNS服务器的方式在局域网中进行过滤,所以我们需要设置Pi-hole为当前网络的DNS。

方法1
这种方法适用于大部分路由器,直接将DNS设置在路由器上。但需要注意的是,应当将DNS设置在LAN接口上(区别于WAN),在我这里是这样的:

 

方法2(推荐)
这种方法适用于一些刷了OpenWRT(LEDE),DD-WRT,Tomato等自定义程度较高固件的路由器,推荐使用该方式

在DHCP选项中填入:6,树莓派IP地址

 

注:若使用该方式,建议将上游DNS设置为路由器

方法3
如果这些选项在你的路由器里都没有,Pi-hole也内置了一个DHCP服务器,具体设置方法不多阐述。

方法4
如果你愿意的话,你也可以针对每一台设备进行设置,方便针对不同的设备进行过滤,具体设置方法不多阐述,自行百度。

不管你使用的哪一种方式,设置完之后都建议重启一下路由器或开关一下飞行模式,让设备使用新的DNS。

3.配置Pi-hole

实际上进行完上面的步骤就已经可以使用了,下面就针对一些常用的功能进行说明。

过滤规则
过滤的规则在这里,可以看到已内置了一些规则:

实际上,Pi-hole使用的是hosts方式对广告进行过滤(类似AdAway),默认的规则对于国内环境不太友好,下面就附上适用于国内环境的一些hosts:

  • yhosts:可以说是国内比较不错的hosts,定期有更新,奈何作者的唯我主义连带屏蔽了一些非广告网站,可以在终端中手动添加白名单:
pihole -w `curl -sSL https://raw.githubusercontent.com/vokins/yhosts/master/data/moot/cps.txt https://raw.githubusercontent.com/vokins/yhosts/master/data/moot/error.txt https://raw.githubusercontent.com/vokins/yhosts/master/data/moot/hate.txt | sed '/^@/d; /^#/d; s/127.0.0.1 //' | tr "\n" " "`
  • neoHosts:比较小众的hosts,看介绍貌似是不满于上面那位而弄出来的。
  • MWSL-hostslist:恶意网站实验室可能没多少人知道,不过其提供的OneDNS可就算是比较有名的了,这个hosts正是OneDNS中所用于屏蔽恶意网站的规则。
  • AdAway:也就是安卓上的AdAway所使用的规则,不过针对中国误杀现象严重,慎用。

如果还有哪些不错的去广告hosts,欢迎在评论区中留言。

相较于通常的过滤方式(如Adblock Plus、KoolProxy等),利用hosts过滤有自己的优缺点。优点是不会拖累网速(甚至可能有一定提升),缺点是过滤效果不尽如人意。

不过如果你要是想要利用这个做一些有违我国国情的事情,放心,那样的话就相当于在你家里再上了一道防火长城(Pi-hole只能将规则中的网站解析到自身以进行屏蔽)。

黑白名单

 

顾名思义就是对过滤规则的手动调整,黑名单分为匹配和通配两种,建议那些整天说退游的同学可以试试。白名单主要是针对一些有防过滤广告或被误杀的网站。

隐私设置

 

在这里你可以设置让一些不想在日志中出现的网站或设备隐藏起来,至于有什么用嘛……那各位自己心里的B数都很清楚啊……

Pi-hole上的一些其他高级功能这里就不多赘述了,有待自行探索。

4.Enjoy it!

到这里关于Pi-hole的全部设置就完成了,打开浏览器访问一些广告较多的网站,看看广告是否被屏蔽了、仪表盘上的数字是否增加,如果没有再仔细按照上面的步骤检查一遍,尤其是关于DNS设置的部分。

好了,和广告Say Goodbye吧!

本文来自:树莓派实验室

 

树莓派 Zero USB/以太网方式连接配置教程

树莓派 Zero 之所以成为一款非常棒的单板计算机并不全因为它小巧的尺寸和便宜的价格,还得益于它便捷、易用的特性。在加装了 Zero Quick Plug 或 microUSB/USB 转换头之后,将树莓派 Zero 和电脑连接起来。树莓派 Zero 即可配置成 USB/以太网设备,这时仅需要一个 USB 接口就实现给树莓派供电的同时将它接入因特网。不再需要携带额外的电源适配器、 USB HUB和无线网卡。可以说这是迄今为止连接树莓派最简单、方便的方式!
对于 Raspbian 2016-10-5 之后的系统镜像,你只需要在系统 SD 卡上修改几处配置文件即可将树莓派配置成一个 USB/以太网设备。
这个教程基于 Windows 平台,在连接树莓派之前,你可能需要在电脑上安装 Bonjour。它允许你的电脑自动识别 USB/以太网设备,例如打印机、扫描仪以及我们需要的树莓派。Bonjour 被包含在 iTunes 与 Adobe CS 软件中,所以很可能你已经装有这个软件,如果没有,你可以在这里单独下载安装。

一、配置 CONFIG.TXT 和 CMDLINE.TXT 文件

开始刷入系统,请确认你下载的系统镜像是 2016-10-5 之后的版本。在电脑上将系统镜像写入 micro SD 卡,可以使用 Win32 Disk Imager 这个工具(这里下载)。

完成之后,在电脑上打开这个 micro SD 卡的根目录 (例如. boot(E:)) 并打开 config.txt 文件。在文件末尾添加一行 dtoverlay=dwc2。

保存并关闭 config.txt 文件。

再打开 cmdline.txt 文件,请确认你的编辑器已关闭“自动换行”。编辑这个文件的时候不需要插入任何换行符,所有字符都在同一行。找到 rootwait,在后面插入 modules-load=dwc2,g_ether。

保存并关闭 cmdline.txt 文件。

最后在根目录创建一个名为 ssh 的文件或目录。

好了,可以从电脑上弹出 SD 卡了。把 SD 卡插入树莓派 Zero,用 Zero Quick Plug 或 microUSB/USB 转换头将树莓派 Zero 和电脑连接起来。

图中用到的这款连接部件是树莓派 Zero 多功能 USB 插头(Zero Quick Plug),详见下图。

这时 Windows 会自动识别到树莓派,并尝试安装驱动。

到这里,打开 PuTTY(这里下载)并尝试通过 SSH 连接树莓派的地址 raspberrypi.local。

如果你发现可以正常连接和登录树莓派,恭喜你!下面“安装 RNDIS 驱动”的步骤可以跳过了!直接从下面“设置共享互联网连接”开始阅读。

如果在这里遇到错误提示 “Unable to open connection to raspberrypi.local. Host does not exist”, 那么你需要在电脑上安装 RNDIS 驱动。

二、安装 RNDIS 驱动(酌情跳过)

保持树莓派与电脑的连接,打开 Windows 的“设备管理”,在“其他设备”中找到“RNDIS/Ethernet Gadget”, 右键选择“更新驱动程序”。

再选择“Browse my computer for driver software”。

选择“Let me pick from a list of device drivers on my computer”。

选择“Network adapters”,下一步。

在 “Manufacturer” 列表中选择 “Microsoft”。在 “Network Adapters” 列表中选择“Remote NDIS Compatible Device”,下一步。

在弹出的对话框中选择“Yes”。

安装完驱动之后,你将看到这个窗口。

现在尝试用 PuTTY 连接地址 raspberrypi.local。

三、设置共享互联网连接

为了将电脑的互联网连接共享给树莓派,我们需要允许共享你电脑上的一个网络连接。打开“Network Connections”。

你的树莓派在里面显示为 “RNDIS/Ethernet Gadget” 的设备类型,在上图示例中,名字是“Ethernet 2”。

现在你要确定用哪一个连接给树莓派访问用 (WiFi 或以太网)。这里我选择让树莓派通过电脑的“Wi-Fi”这个连接去访问互联网,所以我启用这个连接之后在右键“属性”中进行设置。

选择“共享”标签。

勾选“Allow other network users to connect through this computer’s Internet connection”,在下拉菜单中找到树莓派的连接名称(这里选择 Ethernet 2)。

WiFi 网络这时出现“Shared”标注了。

现在可以重启你的树莓派并重新用 PuTTY 登录了。

登录树莓派之后,用 ifconfig 命令查看 usb0 连接可以看到网络上行和下行的流量。

Ping 一下某些网站域名,确认互联网连接是否正常。

如果你用的是 Raspbian 桌面版,你可以安装一个 RDP(远程桌面协议)客户端然后在电脑上通过远程桌面( “Remote Desktop Connection” )客户端连接到树莓派,连接地址同样是raspberrypi.local。(具体方法

将你的树莓派 Zero 配置成 USB/以太网设备,可以仅需要一个 USB 接口就实现给树莓派供电的同时将它接入因特网。不再需要携带额外的电源适配器、 USB HUB和无线网卡。可以说这是迄今为止连接树莓派最简单、方便的方式!

另有 macOS 平台下使用这一功能的教程,移步这里阅读

本文来自:树莓派实验室

 

给树莓派 Zero 添加一个RCA视频输出插头

你知道吗?树莓派 Zero 也是有集成视频输出接口的。

如果你希望用老式的电视作为树莓派 Zero 的显示器,往下阅读吧……

 

没错,正如图上这么简单就可以搞定。树莓派 Zero 并没有限制视频只能通过 HDMI 接口输出,同之前的树莓派1代B型一样,只需要自己将 RCA 给 DIY 接上即可。

首先你需要准备:
树莓派 Zero 主板
RCA 端子 1 个
2Pin 排针 1 个
母对母杜邦线2根

按照图上所示,将排针焊接到树莓派 Zero 的这个位置。

 

这样之后,树莓派会自动检测视频接口并选择从 HDMI 或 RCA 接口输出。如果到这一步并没有效果,请继续阅读按照下面的配置来让它正常工作。

配置软件

先备份 config.txt 文件,以备遇到故障时可以随时恢复。

sudo cp /boot/config.txt /boot/config.txt_backup

然后修改 config.txt。

sudo nano /boot/config.txt

有两行需要修改,去掉这几行前的注释符号“#”。

sdtv_mode=2
hdmi_force_hotplug=1

保存之后关闭树莓派、通过 RCA 接口接上显示器、再启动树莓派,看看显示器是不是正常工作了吧!

本文来自:树莓派实验室