利用树莓派探索以太坊第一部分:环境搭建

在本系列文章的第一部分中,我们将在一台树莓派Pi 3 Model B上安装并运行一个以太坊区块链客户端。

毫无疑问,区块链绝对是当前的热点。之所以会这样,很大程度上是因为比特币以及其他加密货币让很多人一夜暴富。但是,区块链的应用并不仅限于加密货币领域,考虑到其去中心化以及防篡改等特性,区块链技术还可以用到IoT应用中。因此,除了加密货币和安全交易之外,以太坊平台还可以提供一种分布式的计算平台。

在这篇文章中,我们将会对以太坊架构进行分析,并了解其核心思想和功能组件,最后在树莓派上安装相应的客户端软件。需要声明的是,我并不打算用它来挖矿,因为挖矿需要强大的GPU支持,但树莓派只能创建一个简单的实验沙箱,而且我们也只是为了验证区块链技术可以应用到嵌入式平台上。

以太坊101

话不多说,下面给出的是一份以太坊智能合约样本的源代码(来自ethereum.org):

contract mortal {
 /* Define variable owner of the typeaddress */
 address owner;
 
 /* This function is executed atinitialization and sets the owner of the contract */
 function mortal() { owner = msg.sender; }
 
 /* Function to recover the funds on thecontract */
 function kill() { if (msg.sender == owner)selfdestruct(owner); }
}
 
contract greeter is mortal {
 /* Define variable greeting of the typestring */
 string greeting;
 
 /* This runs when the contract is executed*/
 function greeter(string _greeting) public {
 greeting = _greeting;
 }
 
 /* Main function */
 function greet() constant returns (string){
 return greeting;
 }
}

区块链是一种分布式的记账系统,一般通过对等网络进行管理,并且随着记录和区块成功添加到区块链网络中,其大小也会不断增长。一个区块通常包含交易数据以及时间戳,并且会通过哈希算法进行安全加密,数据一旦成功提交到区块链中,将无法再被修改。

以太坊平台拥有自己的加密货币,我们称之为以太币。但是它还基于区块链技术创建了一种针对智能合约的去中心化平台,智能合约对象中包含的代码函数可以在区块链中“生存”,并于其他合约进行交互,制定决策,存储数据,或向其他人发送以太币。

智能合约是用一种名叫Solidity(基于JavaScript)的编程语言实现的,Solidity编译器可以将智能合约编译成字节码(跟JavaScript、Python、Java或Android类似),然后通过以太坊虚拟机(EVM)执行。需要注意的是,在智能合约中进行交易是有成本的,这部分内容我们之后会进行讨论。

目前市场上有好几款不同的以太坊客户端(基于Geth,采用Go语言开发),其中的某些能够挖以太币,有些则是单独的挖矿软件。除了主要的以太坊区块链网络和矿池之外,还有很多用于实验和测试的网络,当然了,你也可以创建自己的私有区块链网络。

安装Geth

假设我们现在已经安装好了Raspbian,我们需要将已安装的数据包软件更新至最新版本:

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

当我第一次尝试编译以太坊客户端时,出现了内存不足的情况,为了将RAM腾出来给这种内存密集型任务,最好的方法就是减少分配给GPU的内存空间。如果你不需要图形桌面,你可以将系统以命令行界面启动。

$ sudo raspi-config

接下来,安装相应的依赖组件:

 $ sudo apt-get install git golang libgmp3-dev

接下来,从GitHub获取Geth的官方源码(采用Go语言实现的官方以太坊源码),对代码进行编译并将可执行程序拷贝到/usr/local/bin/。

$ mkdir src
$ cdsrc
$ gitclone -b release/1.7 https://github.com/ethereum/go-ethereum.git
$ cdgo-ethereum
$ make
$ sudo cp build/bin/geth /usr/local/bin/

创建账号并进行测试

使用Geth创建一个新的账号:

$ geth account new

接下来程序会创建一套新的加密密钥,并使用了密码来保护私钥的安全。需要注意的是,如果你想用这个账号来挖矿并进行交易的话,你需要确保已经备份了你的密钥并防止你的私钥被他人访问。

现在,我们需要运行节点。

$ geth --syncmode light --cache <span class="hljs-number">64</span> --maxpeers <span class="hljs-number">12</span>

如果我们在不使用任何参数的情况下运行Geth,它将开启一个节点并尝试跟整个公共区块链主网进行数据同步,数据大小在50GB以上,并且还会继续增长,因此不适用于嵌入式计算机。所以说,我们准备以轻量级同步模式运行该节点,这种模式只会获取区块Header信息。

按下CTRL+C后就可以退出节点了,我们可以在设备启动时让它以服务的形式运行:

$ sudo vi /etc/systemd/system/geth@.service

然后添加下列代码:

 [Unit]
Description=Ethereumdaemon
Requires=network.target
 
[Service]
Type=simple
User=%I
ExecStart=/usr/local/bin/geth--syncmode light --cache 64 --maxpeers 12
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

保存文件,下列命令可以让以太坊节点以“pi“用户身份运行:

$ sudo systemctl enable geth@pi.service
$ sudo systemctl start geth@pi.service

接下来,我们可以使用下列命令绑定节点:

$ geth attach

这样我们就能得到一个交互式JavaScript控制台,这里我们可以调用任何函数,比如说:

>eth.accounts

该命令可以输出当前账号列表:

或者获取已连接节点的信息:

>admin.peers

需要注意的是,轻量级客户端协议仍处于开发阶段,因此某些实验性的功能可能还无法完美支持。

总结

现在,我们已经安装好客户端软件了,并成功创建了一个账号,然后开启了一个可通信节点。接下来在本系列文章的第二部分中,我们将组建一个私有区块链网络,并进行实际的交易活动。稍等片刻,我们马上就来!

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

 

 

 

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

本文介绍了如何在树莓派上,使用 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 中的专辑或特定播放列表,做法和实现目标基本上没有什么大分别。

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

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

 

赛普拉斯为树莓派3B+ IoT单板计算机提供稳定的无线连接能力

3月15日,赛普拉斯宣布其Wi-Fi®和蓝牙®combo解决方案为全新的树莓派 3 B+(Raspberry Pi 3 Model B+)IoT单板计算机提供强大稳定的无线连接能力。赛普拉斯CYW43455单芯片combo解决方案提供速度更快的高性能802.11ac Wi-Fi 网络连接、用于音频和视频流媒体播放等蓝牙和蓝牙低功耗(BLE)同步运行的高级共存算法,以及与智能手机、传感器和蓝牙Mesh网络的低功耗BLE连接能力。该combo的高速802.11ac传输能力,可实现出众的网络性能、更快的下载速度和更好的覆盖范围,并借助快速深度睡眠模式实现更低的功耗。树莓派 3 B+型板卡基于已经大获成功的采用赛普拉斯的CYW43438 802.11n Wi-Fi和蓝牙combo芯片系统(SoC)的树莓派解决方案。

基于802.11ac的Wi-Fi网络可同时实现低时延和高传输速度,还具有安全设备通信的特性,从而使其成为理想的将设备直接连接到云端的无线技术。内置高度集成的赛普拉斯CYW43455  combo SoC的树莓派3 B+板卡,使开发人员能够快速构建工业物联网系统和能够发挥802.11ac优势的智能家居产品原型。

树莓派首席执行官Eben Upton表示:“在拥挤的频段中实现可靠的无线连接是工业物联网和智能家居系统开发人员关心的首要问题,因此我们为树莓派3 B+板卡选择了赛普拉斯的802.11ac  combo SoC。我们的新板卡将高性能、可互操作和高度可靠的802.11ac Wi-Fi广泛用于各种物联网产品。”
赛普拉斯物联网事业部营销副总裁Brian Bedrosian表示:“树莓派采用赛普拉斯连接产品,创造出领先的物联网开发板,迄今已售出数百万台,新型树莓派3 B+板卡将赛普拉斯802.11ac Wi-Fi的优势带给更多物联网开发人员并广泛的覆盖了各种应用。我们的802.11ac combo SoC能使物联网产品在拥挤的2.4-GHz频段中轻松应对共存挑战,为音频、视频和语音控制数据提供更干净的环境,同时提升多用户环境下的网络性能。”
树莓派3 B+板卡配备1.4GHz 64位四核处理器,1GB RAM,全尺寸HDMI和4个标准USB端口、USB2上的千兆以太网、以太网供电功能、CSI摄像头连接器以及DSI显示连接器。该平台的资源及其802.11ac无线局域网和蓝牙/ BLE无线连接,可为所连接的设备提供紧凑的智能解决方案。
赛普拉斯CYW43455 SoC采用2.4和5 GHz双频段,提供20、40和80 MHz信道,性能最高可达433 Mbps。802.11ac的高速吞吐量使设备能够更快连接网络,避免网络拥塞,并通过延长设备深度睡眠模式时间延长电池续航。SoC包括带企业和工业功能的Linux开放源代码全媒体访问控制(FMAC)驱动程序支持,具有安全性、漫游、语音和定位等功能。
赛普拉斯CYW43455 SoC和其他解决方案支持蓝牙Mesh网络,通过简单、安全和无处不在的蓝牙连接实现低成本、低功耗的设备mesh网络,使设备能够彼此之间,以及与智能手机、平板电脑和语音控制家庭辅助设备之间相互通讯。蓝牙Mesh使网络中的电池供电设备能够相互通信,即使在最大的住宅也能轻松覆盖,从而使得用户可以将所有设备掌控在手中。赛普拉斯综合全面的一站式嵌入式设备无线互联网连接(WICED®)软件开发套件(SDK)支持基于该SoC的开发,从而简化了物联网开发人员的无线技术集成工作。
转自集微网

树莓派3B Plus评测(对比Pi 3B)

在评测之前呢,先介绍下目前树莓派家族~

可见,3B Plus为最高端产物,之前Model B之后有个Model B Plus,性能提升,温度下降,不知道3B Plus又能如何表现呢?我们就开封两个不同版本的Pi测试一下.

软件测试条件:

  1. TF卡 16G 东芝C10
  2. 5V 2.5A 电源
  3. newifi 3 千兆路由
  4. 超七类网线
  5. SanDisk U110 SSD (JMS576 转接)
  6. Raspbian 2018-03-13 版本(根据测试,其他版本无法再Raspberry Pi 3B Plus启动.)

测试对象:

  1. Raspberry Pi Model 3B Plus
  2. Raspberry Pi Model 3B

第一节,CPU基本信息.

首先是Raspberry Pi Model 3B Plus,识别出版本号是a020d3.

其次看看Raspberry Pi Model 3B,识别出版本号是a22082

第二节,wiringPi 识别

首先是Raspberry Pi Model 3B Plus,其中wiringPi是会识别的,但是GPIO操作是会失败…

在Raspberry Pi Model 3B完全正常,毕竟出来这么久了,也很正常了…

第三节:CPU性能(使用sysbench)

单核性能测试命令: sysbench –test=cpu –cpu-max-prime=20000 –num-threads=1 run

首先是Raspberry Pi Model 3B Plus,他的单核性能如下(317.6974 秒执行完成):

多核性能测试命令: sysbench –test=cpu –cpu-max-prime=20000 –num-threads=4 run

因为调度核心也是需要资源的,所以核心调度能力也影响了具体性能,所以执行时间会略比原来的1/4长一些.

在Raspberry Pi Model 3B Plus下,他的多核性能如下(80.6170 秒执行完成):

其次是Raspberry Pi Model 3B,他的单核性能如下(370.5472 秒执行完成):

而他的多核性能如下(93.0482 秒执行完成)

第四节:内存性能 (使用sysbench)

内存性能测试命令: sysbench –test=memory –memory-total-size=50G run

首先是Raspberry Pi Model 3B Plus,他的传输性能如下(传输速度:640.86MB/sec):

其次看看Raspberry Pi Model 3B,他的传输性能如下(传输速度:551.76/sec):

第五节:GPU性能( GeeXLab 测试软件,屏幕分辨率800 * 480 )

首先看Raspberry Pi Model 3B Plus,他的GPU性能如下(传输速度:216fps,窗口大小800*480.):

再看看Raspberry Pi Model 3B,他的GPU性能如下(传输速度:220fps,窗口大小800*480.):

他们几乎没区别,可以理解成误差了.

 

第六节:无线网络性能

Raspberry Pi Model 3B Plus 无线竟然没法用…

测试Raspberry Pi Model 3B.(距离路由30cm,附近有6个2.4G的AP)

第七节:有线网络性能(iperf 测试)

使用数据生成方法来测试,就是没有实际文件读取.

先看Raspberry Pi Model 3B Plus,他的TCP性能如下.可见于宣传还是有出入的,而且看起来不是CPU能力问题,是转换问题.

然后使用USB传输数据,为了避免速度瓶颈,我选择SSD插在USB上.理论上来说,大家都占用了USB带宽,应该速率会下降,我们来看看成绩.

因为Raspberry Pi Model 3B不带千兆网,所以成绩肯定差一下,也要试试.

另外,能传递多少速率,还要跟CPU一起衡量,幸好树莓派CPU还是足够处理这么点网络资源的.

下面结果是直接传输.

因为没有达到USB瓶颈,所以就算要发送的文件在USB上,也并没看出百兆网降低(因为本身就不快)

第八节:USB性能

先看Raspberry Pi Model 3B Plus,他的USB HUB芯片换成LAN7515,看起来更高端,虽然温度范围没那么广泛.但是USB性能也基本能跑满USB 2.0了.

再看Raspberry Pi Model 3B也读取速度欠佳一些.

USB2.0的理论带宽并不是480Mbps/8=60MB/s,而是约等于48MB/s(UASP协议),或22.14MB/s(BULK协议)

第九节:功耗测试

Raspberry Pi Model 3B Plus,因为Raspberry Pi Model 3B Plus暂时还没有支持的游戏机系统等,所以还是用默认系统测试.不接外设,只接入屏幕(屏幕独立供电),没有外设,空闲时候功耗约450mA.进入CPU和GPU双烤的状态下,功耗约1.67A.这些还是没有外设下功耗,如果带着外设,功耗会更大.

Raspberry Pi Model 3B,因为Raspberry Pi Model 3B 与Raspberry Pi Model 3B Plus同样条件测试,空闲时候功耗约370mA.进入CPU和GPU双烤的状态下,功耗约1.32A.总体来说,低于Raspberry Pi Model 3B Plus.

第十节:温度测试,使用如下脚本.(室温23度)

 while true;do vcgencmd measure_temp; cat /sys/class/thermal/thermal_zone0/temp; sleep 2; done

在Raspberry Pi Model 3B Plus双烤模式下,达到了81度的CPU温度,80度的GPU温度的高温,配备散热措施势在必行,因为官方说了,50度是正常的.而且这里测试不出HUB芯片的温度,实际上温度更高.PMIC是带有温度传感器的,然而官方还没开发.最后,得益于金属外壳封装的CPU,温度才下来了吧.

在充分关机降温情况下,重新开机测量温度,结果如下:

换作Raspberry Pi Model 3B,双烤接近85度.

在充分关机降温情况下,重新开机测量温度,结果如下:

第十一节:降频

在Raspberry Pi Model 3B Plus中,测试发现,无论如何,他频率都显示为1.4GHz,通过改变设备文件,发现没有效果,初步猜测频率只是一个数字,因为根据实际体验,只要温度上去了,运行就非常之卡!而在以往的Raspberry Pi Model 3B中,75度才降频.

大家还想知道其他的,我尽量给大家评测,欢迎大家留言.