树莓派:入门(基础配置、GPIO、网络编程 Socket)

   日期:2020-05-03     浏览:216    评论:0    
核心提示:树莓派在创客中越来越发挥重要的作用,树莓派的强大兼用性和功能丰富,得到 DIY 朋友的青睐。带大家认网络

树莓派在创客中越来越发挥重要的作用,树莓派的强大兼用性和功能丰富,得到 DIY 朋友的青睐。带大家认识目前最新的树莓派 3B+,从零基础到入门,到动手做有趣的应用.

本场 Chat 首先会带领大家入门树莓派的基础,然后进一步通过树莓派控制 LED,电机小车等,还会带大家了解下多个机器如何通讯交流——网络编程,最后做一个树莓派二维码识别 。

本场 Chat 您将学到如下内容:

  1. 树莓派配置中文环境,安装搜狗输入法;
  2. GPIO 模块的使用,控制 LED,电机等;
  3. 树莓派:实时视频监控;
  4. 树莓派 Python 网络编程(Socket 入门);
  5. 树莓派安装 OpenCV;
  6. 树莓派二维码(QR)识别。

配置中文环境

我们首先更新软件安装库

输入代码 :sudo apt-get update

等待一下,然后更新完成

安装中文字库

由于树莓派默认是采用英文字库的,而且系统里没有预装中文字库,所以即使你在 locale 中改成中文,也不会显示中文,只会显示一堆方块。因此需要我们手动来安装中文字体,好在有一个中文字体是免费开源使用。

输入代码 :sudo apt-get install ttf-wqy-zenhei等待一下

刷新字库缓存

输入代码 :sudo fc-cache

在命令状态下输入一下代码,打开配置界面

输入代码 :sudo dpkg-reconfigure locales

进入语言配置界面

选择 change_locale,然后进入如下图界面:

然后,往下找(键盘-按下键),在较后面,找到 zh_CN.UTF-8 UTF-8,如图所示:

确定,按下回车键。恭喜你,配置中文环境成功了,哈哈~

安装谷歌拼音输入法(树莓派官方版系统、基于 Debian):

我们即可直接通过资源库安装谷歌拼音和 Fcitx 模块以及 Sunpinyin 模块等,命令如下:

sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin

待安装完成后使用重启即可,之后输入的地方即可看到谷歌拼音,如果没有则点击右上角键盘按钮切换:sudo reboot

打开树莓派的桌面,点击有上方键盘的按钮: 然后右键鼠标,点击 配置,然后可以看到 系统中全部的输入法

能看到,谷歌拼音,说明安装成功了.

实时视频监控

这是利用 Dominic Szablewski 出色的 JSMPEG 项目,将 Pi 的相机模块低延迟流式传输到任何合理的现代网络浏览器的 演示。其他依赖项是 Python ws4py 库,我的 picamera 库(特别是 1.7 或更高版本)和 FFmpeg。

方法一

安装

首先确保你有一个功能正常的 Pi 相机模块(测试它 raspistill 是确定的)。然后确保安装了以下软件包:

sudo apt-get install ffmpeg git python3-picamera python3-ws4py

接下来,克隆此存储库:

git clone https://github.com/waveform80/pistreaming.git

用法

运行 Python 服务器脚本,该脚本应在启动时将大量内容打印到控制台:

cd pistreamingpython3 server.py

终端显示信息:

Initializing websockets server on port 8084Initializing HTTP server on port 8082Initializing cameraInitializing broadcast threadSpawning background conversion processStarting websockets threadStarting HTTP server threadStarting broadcast thread

现在启动你最喜欢的网络浏览器并访问该地址 http://pi-address:8082/- 它应该很快开始显示来自摄像头的提要。您应该能够同时访问来自多个浏览器的 URL(尽管显然您迟早会使 Pi 的带宽饱和)。

如果你发现视频口吃或延迟特别糟糕(超过一秒钟),请检查 Pi 与客户端之间是否有良好的网络连接。我发现以太网工作得很好(即使中间有电力线盒等)但是一个糟糕的 wifi 连接不能提供足够的带宽,丢弃的数据包处理得不是很好。

要关闭服务器,请按 Ctrl + C - 您可能会发现关闭它需要一段时间,除非您关闭客户端 Web 浏览器(Chrome 特别倾向于保持连接打开,这将阻止服务器关闭,直到套接字关闭)。

方法二

先安装相关软件

    sudo apt-get install libav-tools git python-setuptools python-pip python-picamera    sudo pip install ws4py

下载代码

git clone https://github.com/waveform80/pistreaming.git

使用方法

cd pistreamingpython server.py

终端显示信息:

Initializing websockets server on port 8084Initializing HTTP server on port 8082Initializing cameraInitializing broadcast threadSpawning background conversion processStarting websockets threadStarting HTTP server threadStarting broadcast thread

非常流畅,几乎感觉不到延时,另外手机上也可以通过浏览器查看了。

GPIO 基础输入 input

RPi.GPIO 模块程序包提供了一个在 Raspberry Pi 中控制 GPIO 的类。 使用步骤:

导入模块

import RPi.GPIO as GPIO

通过该操作,可以将模块名称映射为 GPIO,以便接下来您其它脚本进行使用。

针脚编号

目前有两种方式可以通过 RPi.GPIO 对 Raspberry Pi 上的 IO 针脚进行编号。

第一种方式 是使用 BOARD 编号系统。该方式参考 Raspberry Pi 主板上 P1 接线柱的针脚编号。使用该方式的优点是无需考虑主板的修订版本,硬件始终都是可用的状态。将无需从新连接线路和更改您的代码。

 GPIO.setmode(GPIO.BOARD)

第二种方式 是使用 BCM 编号。这是一种较低层的工作方式 – 该方式参考 Broadcom SOC 的通道编号。使用过程中,您始终要保证主板上的针脚与图表上标注的通道编号相对应。您的脚本可能在 Raspberry Pi 主板进行修订版本更新时无法工作。

GPIO.setmode(GPIO.BCM)

注意:两种方式中,必须指定其中一种。

禁用该警告消息

GPIO.setwarnings(False)

可能您的 Raspberry Pi 的 GPIO 上同时有多个脚本/循环。因此,如果 RPi.GPIO 检测到某个针脚被设置为其它用途而非默认的状态(默认为输入),您会在尝试配置某脚本时得到警告消息

配置通道

您需要为每个用于输入或输出的针脚配置通道

GPIO.setup(channel, GPIO.IN)

通道编号是基于您所使用的编号系统所指定的(BOARD 或 BCM)

清理

在任何程序结束后,请养成清理用过的资源的好习惯。使用 RPi.GPIO 也同样需要这样。恢复所有使用过的通道状态为输入,您可以避免由于短路意外损坏您的 Raspberry Pi 针脚。注意,该操作仅会清理您的脚本使用过的 GPIO 通道。

GPIO.cleanup()  //程序最后结束后,可以全部设置为输入

补充说明:

1)上拉/下拉电阻

如果您在输入针脚上没有连接任何元件,那么它将是“浮动(float)”的。换句话说,因为您没有连接任何元件,在按下按钮或开关之前,读取的值是没有意义的。由于电源的波动,获取到的值可能会有很大的变化,

在这里,可以使用硬件或软件对电阻进行上拉/下拉。使用硬件方式,将一个 10K 的电阻连接在输入通道与 3.3V(上拉)或 0V(下拉)之间是常用的做法。而 RPi.GPIO 也允许您通过软件的方式对配置 Broadcom SOC 来达到目的:

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_UP)

或者

GPIO.setup(channel, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

2)输入测试(轮询(polling))

您可以在某个时间点获得一次输入的快照:

if GPIO.input(channel):       print('Input was HIGH')else:    print('Input was LOW')

在循环中等待按钮被按下后进行轮询:

while GPIO.input(channel) == GPIO.LOW:    time.sleep(0.01)  # 为 CPU 留出 10 毫秒,供其处理其它事物

(这里假设为当按下按钮时,输入状态从 LOW 到 HIGH)

3)中断和边检检测

边缘的定义为电信号从 LOW 到 HIGH(上升临界值)或从 HIGH 到 LOW(下降临界值)状态的改变。正常情况下,对于输入的值来说,我们更关心的是输入的状态是否发生了改变。这种状态上的改变是很重要的。

为了避免您的程序在忙于处理其它的事物时而错过了您按下按钮的操作,这里有两种方法可以解决:

waitforedge() 函数 event_detected() 函数被设计用于循环中有其它东西时使用,但不同于轮询的是,它不会错过当 CPU 忙于处理其它事物时输入状态的改变。这在类似使用 Pygame 或 PyQt 时主循环实时监听和响应 GUI 的事件是很有用的。

GPIO.add_event_detect(channel, GPIO.RISING)  # 在通道上添加上升临界值检测do_something()if GPIO.event_detected(channel):    print('Button pressed')

注意,您可以输入 GPIO.RISING、GPIO.FALLING、GPIO.BOTH 对边缘进行检测。

这两种方法在检测到边缘时执行线程回调函数。

注意,该模块(RPi.GPIO 树莓派 )不适合应用到追求实时性或计数周期的应用中。这是由于您无法预测 Ptyhon 何时繁忙,以及资源回收的时间。而且它是运行在基于 Linux 核心的系统中,也不合适用于实时应用 – 原因在于其它进程可能获得更高的 CPU 优先级。

GPIO 基础--输出

实验准备的材料:树莓派、LED 灯一盏、杜邦线两根本次实验,点亮的 GPIO 引脚是 40

具体再看一下源代码,看是否能理解:

    import RPi.GPIO as GPIO              #导入树莓派的 GPIO 包    import time                          #导入定时器包    GPIO.setmode(GPIO.BOARD)             #设置 IO 针脚进行编号    GPIO.setup(40,GPIO.OUT)              #设置编号为 40 的 IO 口,为输出模式    for i in range(0,3):                 #LED 灯程序会在这个循环体中,执行 3 次        GPIO.output(40,1)                # IO 口为 40,输出高电平,点亮 LED 灯        time.sleep(0.5)                  #等待 0.5 秒,让 LED 亮 0.5 秒        GPIO.output(40,0)                # IO 口为 40,输出低电平,熄灭 LED 灯        time.sleep(0.5)                  #等待 0.5 秒,让 LED 延续上一个状态 0.5s    GPIO.cleanup()                       #恢复所有使用过的通道状态为输入

下面来看一下具体原理:RPi.GPIO 模块程序包提供了一个在 Raspberry Pi 中控制 GPIO 的类。

使用步骤:1. 导入模块

import RPi.GPIO as GPIO

通过该操作,你可以将模块名称映射为 GPIO,以便接下来你其它脚本进行使用。

2. 针脚编号目前有两种方式可以通过 RPi.GPIO 对 Raspberry Pi 上的 IO 针脚进行编号。 第一种方式 是使用 BOARD 编号系统。该方式参考 Raspberry Pi 主板上 P1 接线柱的针脚编号。使用该方式的优点是无需考虑主板的修订版本,你硬件始终都是可用的状态。你将无需从新连接线路和更改你的代码。 (推荐)

 GPIO.setmode(GPIO.BOARD)

第二种方式 是使用 BCM 编号。这是一种较低层的工作方式 – 该方式参考 Broadcom SOC 的通道编号。使用过程中,你始终要保证主板上的针脚与图表上标注的通道编号相对应。你的脚本可能在 Raspberry Pi 主板进行修订版本更新时无法工作。

GPIO.setmode(GPIO.BCM)

注意:两种方式中,必须指定其中一种。

3.禁用该警告消息:GPIO.setwarnings(False) 可能你的 Raspberry Pi 的 GPIO 上同时有多个脚本/循环。因此,如果 RPi.GPIO 检测到某个针脚被设置为其它用途而非默认的状态(默认为输入),你会在尝试配置某脚本时得到警告消息

4.配置通道你需要为每个用于输入或输出的针脚配置通道GPIO.setup(channel, GPIO.IN)(通道编号是基于你所使用的编号系统所指定的(BOARD 或 BCM)。)

5.清理 在任何程序结束后,请养成清理用过的资源的好习惯。使用 RPi.GPIO 也同样需要这样。恢复所有使用过的通道状态为输入,你可以避免由于短路意外损坏您的 Raspberry Pi 针脚。注意,该操作仅会清理你的脚本使用过的 GPIO 通道。GPIO.cleanup() //程序最后结束后,可以全部设置为输入

Python 网络编程 --Socket 入门

什么是 Socket?Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

Python 提供了两个级别访问的网络服务。:

低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。服务端

1、socket():创建一个 socket 例子:s =socket.socket()

2、bind(): 绑定 IP 地址和端口,他接受是一个元组数据 例子 s.bind(("127.0.0.1",8088))

3、listen():定义最多能挂起的数目 。例子: s.listen(2) 允许两个客户端等待发送信息 (挂起)

4、accept():创建主机和客户的连接 conn.addr=s.accept()

以下是服务器端代码,server.py

import socket               # 导入 socket 模块s = socket.socket()         # 创建 socket 对象host = socket.gethostname() # 获取本地主机名port = 12345                # 设置端口s.bind((host, port))        # 绑定端口s.listen(5)                 # 等待客户端连接 while True:    c, addr = s.accept()     # 建立客户端连接。    print '连接地址:', addr    c.send('欢迎访问树莓派课程!')    c.close()                # 关闭连接

客户端

1、socket() :创建 socket s=socket.socket()

2、connect():用自己的对象去连接服务端 s.connect(("127.0.0.1",8088))

以下是客户端代码,client.py

import socket               # 导入 socket 模块s = socket.socket()         # 创建 socket 对象host = socket.gethostname() # 获取本地主机名port = 12345                # 设置端口号s.connect((host, port))print s.recv(1024)s.close() 

具体操作步骤:

现在我们打开两个终端(或者两个 python IDLE),第一个终端执行 server.py 文件:​第二个终端执行 client.py 文件:

这时我们再打开第一个终端(服务器端),就会看到有以下信息输出:连接地址: ('192.168.0.118', 62461) 这时我们打开客户端,就会看到有以下信息输出: b'hello'

树莓派 二维码(QR)识别

要使用的工具

  1. python Image 图像包
  2. zbar 条码及二维码识别库
  3. opencv 库

识别效果

在树莓派终端键入的命令以及得到的识别结果:可以看到识别结果被红色矩形框标记,QR 码的内容为 YGSOFT001

接下来详细的描述整个工作过程。

python Image 图像包的安装

sudo apt-get install python-imaging

zbar 安装执行如下代码

sudo apt-get -y install libzbar-devwget https://pypi.python.org/packages/source/z/zbar/zbar-0.10.tar.gztar xzf zbar-0.10.tar.gzcd zbar-0.10wget https://github.com/npinchot/zbar/commit/d3c1611ad2411fbdc3e79eb96ca704a63d30ae69.patchgit apply d3c1611ad2411fbdc3e79eb96ca704a63d30ae69.patchsudo python setup.py install

如果安装出现问题,请尝试 sudo apt-get update 以及 sudo apt-get upgrade,然后再重试上面的安装步骤。

编写 python 程序

首先是导入相应的包

import cv2import pyzbar.pyzbar as pyzbarimport time

下面是源程序:

import cv2import pyzbar.pyzbar as pyzbarimport timedef decodeDisplay(image):    barcodes = pyzbar.decode(image)    for barcode in barcodes:        # 提取二维码的边界框的位置        # 画出图像中条形码的边界框        (x, y, w, h) = barcode.rect        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)        # 提取二维码数据为字节对象,所以如果我们想在输出图像上        # 画出来,就需要先将它转换成字符串        barcodeData = barcode.data.decode("utf-8")        barcodeType = barcode.type        # 绘出图像上条形码的数据和条形码类型        text = "{} ({})".format(barcodeData, barcodeType)        cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,                    .5, (0, 0, 125), 2)        # 向终端打印条形码数据和条形码类型        print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))    return imagedef detect():    camera = cv2.VideoCapture(0)    camera.set(3,640) #设置分辨率    camera.set(4,480) #设置分辨率    #time.sleep(0.5)    while True:        # 读取当前帧        ret, frame = camera.read()        # 转为灰度图像        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)        im = decodeDisplay(gray)        cv2.waitKey(5)        cv2.imshow("camera", im)    camera.release()    cv2.destroyAllWindows()if __name__ == '__main__':    detect()

然后安装好摄像头,执行程序就可以啦。

阅读全文: http://gitbook.cn/gitchat/activity/5d482bc09f6c224f217784ab

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服