0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

仅仅使用代码,就能点亮树莓派的 GPIO 世界

上海晶珩电子科技有限公司 2025-03-25 09:31 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Raspberry Pi的一个流行应用是构建Web服务器。为此,我们可以使用不同的技术,如PythonNode.JS甚至PHP。由于Raspberry Pi的绝大多数脚本都是用Python编写的,因此使用Python创建REST API接口也是合情合理的。然后,我们可以调用特定的函数,例如控制或读取GPIO。这可以方便地控制LED或其他传感器/模块。其美妙之处在于,我们可以使迄今为止为Raspberry Pi用Python编写的几乎所有代码都可以轻松通过REST API进行调用。因此,在本教程中,我们将使用FastAPI创建这样一个接口,并探讨如何扩展和保障其安全。

所需硬件部件

原则上,本教程不需要太多的配件。但是,由于我们想测试我们的设置是否有效,我建议使用以下部件:

Raspberry Pi

LED灯

330Ω电阻

面包板

雌性-雌性跳线

当然,你可以根据自己的需求进行扩展,并连接传感器(如‍温度传感‍器等),我们可以通过API对其进行查询。

什么是REST API?

API(应用程序编程接口)是一种可以通过URL等调用的接口。REST(表述性状态转移)概括了一些原则,描述了接口应该如何表现,例如,GET请求应该是只读的,并且不应该更改服务器上的任何内容。另一方面,POST命令允许创建新实体(例如,书籍的新实例)。你可以在这里了解更多关于实现的信息。

Raspberry Pi上的设置

在本教程中,Raspberry Pi上的设置非常简单,因为我们只使用一个LED和一个按钮。当然,你的场景可以(应该!)与此不同,因为它只是一个示例,因此也非常简单。

d25ce8fc-0918-11f0-9434-92fbcf53809c.jpg

LED通过330Ω串联电阻连接到GPIO 17,按钮连接到3.3V和GPIO 21。

此外,我们在以下内容中使用GPIO的BCM编号,而不是板载编号:

Raspberry PiGPIO引脚分配

d264fd08-0918-11f0-9434-92fbcf53809c.jpg

Python REST API 的软件组件

现在,我们将逐步创建API。首先,我们准备所需的工具。之后,我们创建并扩展我们的REST API,以切换或读取GPIO。最后但同样重要的是,我们要保障API的安全,以免任何人都可以访问它。

顺便说一下:你也可以在Github上找到我们将逐步讲解的整个代码。

安装库

在开始之前,我们需要Python3和一些库,我们通过包安装器pip加载它们。

sudo apt-get install python3 python3-pip

之后,我们可以安装所需的Python库:

pip3 install fastapi uvicorn[standard] rpi.gpio

可以在各自的文档页面(fastapi、uvicorn、rpi.gpio)上找到更多信息。

入门:首先通过API读取状态

让我们开始第一次测试。为此,我们创建一个简单的Python脚本。

sudo nano main.py

脚本内容如下:

from fastapi import FastAPIimport RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False) app = FastAPI() @app.get("/read/{gpio}")def read_root(gpio: int): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) return {"gpio": gpio, "on": GPIO.input(gpio)}

使用CTRL+O保存文件,并使用CTRL+X关闭nano编辑器。之后,我们就可以启动程序了。

uvicorn main:app --reload

现在,你可以在Raspberry Pi的浏览器中打开以下URL:http://127.0.0.1:8000/read/17

如果按钮连接到不同的引脚,你可以更改GPIO编号。如果你没有按下按钮,结果将如下所示:

{"gpio":17,"on":false}

这是我们在此端点下定义的响应。如果你按下按钮并再次调用URL,结果将发生变化。仅用几行代码,我们就编写了第一个REST端点。但现在我们想对其进行扩展。

扩展我们的Python API——设置GPIO状态

纯读取有点无聊,所以我们当然还想控制和设置GPIO。因此,我们创建了另一个端点(这次是PATCH,因为我们要更改内容):

from fastapi import FastAPIfrom pydantic import BaseModelimport RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False) app = FastAPI() class SetGPIO(BaseModel): on: bool @app.get("/read/{gpio}")def read_root(gpio: int): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) return {"gpio": gpio, "on": GPIO.input(gpio)} @app.patch("/set/{gpio}")def read_item(gpio: int, value: SetGPIO): if value.on: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.HIGH) else: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.LOW) return {"gpio": gpio, "on": value.on}

如您所见,第一个参数再次是GPIO编号,

你可以使用Postman、浏览器扩展或cURL(sudo apt-get install curl)。我使用了后者:

curl -X PATCH http://127.0.0.1:8000/set/21 -H "Content-Type: application/json" -d '{"on": true}'

这样,LED就亮了!

顺便说一下,你可以在http://127.0.0.1:8000/docs找到API文档,这是使用Swagger/OpenAPI自动生成的。为了使响应更具可读性,我们定义了模型(response_model)。这只是一个具有属性的类,在端点的定义中,我们声明将返回此模型。

from fastapi import FastAPIfrom pydantic import BaseModelimport RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False) app = FastAPI() class GpioStatusResponse(BaseModel): gpio: int on: bool class SetGPIO(BaseModel): on: bool @app.get("/read/{gpio}", response_model=GpioStatusResponse)def read_root(gpio: int): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) return GpioStatusResponse(gpio=gpio, on=GPIO.input(gpio)) @app.patch("/set/{gpio}", response_model=GpioStatusResponse)def read_item(gpio: int, value: SetGPIO): if value.on: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.HIGH) else: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.LOW) return GpioStatusResponse(gpio=gpio, on=value.on)

最后一项练习:构建一个端点(POST),用于在GPIO上激活PWM,以便我们能够调节LED的亮度(点击此处访问PWM文档)。

https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/此外,您现在拥有足够的资源来构建一个与用户界面交互的GPIO,例如:

https://github.com/tutRPi/Raspberry-Pi-Simple-Web-GPIO-GUI

安全性——基本认证和其他方法

如果我们开放Raspberry Pi的8000端口,任何人都可以访问该API。我们要防止这种情况发生,并加入认证机制。为此,我们有几种选择:

1.每次调用API时,都会在请求头中发送用户名和密码。为此,我们使用基本认证,并在调用时验证数据的正确性。

2.另外,我们还可以使用带有JWT(JSON Web Tokens)的oauth2,它们也是通过请求头发送的。为了简化起见,本教程中不会进行此操作。如果您仍然想实现它(作为练习),可以在此处了解更多相关信息。

现在,我们再次打开脚本并相应地进行调整:

from fastapi.security import HTTPBasic, HTTPBasicCredentialsfrom pydantic import BaseModelfrom fastapi import Depends, FastAPI, HTTPException, statusimport RPi.GPIO as GPIOimport secrets GPIO.setmode(GPIO.BCM)GPIO.setwarnings(False) app = FastAPI()security = HTTPBasic() class GpioStatusResponse(BaseModel): gpio: int on: bool class SetGPIO(BaseModel): on: bool def get_current_username(credentials: HTTPBasicCredentials = Depends(security)): correct_username = secrets.compare_digest(credentials.username, "admin") correct_password = secrets.compare_digest(credentials.password, "passw0rd") if not (correct_username and correct_password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect email or password", headers={"WWW-Authenticate": "Basic"}, ) return credentials.username @app.get("/read/{gpio}", response_model=GpioStatusResponse)def read_root(gpio: int, username: str = Depends(get_current_username)): GPIO.setup(gpio, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) return GpioStatusResponse(gpio=gpio, on=GPIO.input(gpio)) @app.patch("/set/{gpio}", response_model=GpioStatusResponse)def read_item(gpio: int, value: SetGPIO, username: str = Depends(get_current_username)): if value.on: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.HIGH) else: GPIO.setup(gpio, GPIO.OUT, initial=GPIO.LOW) return GpioStatusResponse(gpio=gpio, on=value.on)

为了使查询能够成功进行,我们需要包含用户名和密码(第24/25行)。使用curl或Postman可以很容易地实现这一点:

curl -X PATCH http://127.0.0.1:8000/set/21 -H "Content-Type: application/json" -d '{"on": false}' -u "admin:passw0rd"

最后但同样重要的是:如果您希望通过互联网访问API(即向外部世界开放您的端口),建议使用SSL证书(如Let’s Encrypt),以确保连接加密。您可以在此页面上了解更多相关信息。

结论

使用FastAPI,我们可以非常轻松、快速地创建一个REST接口,并调用特定于Raspberry Pi的函数。通过它,我们可以控制GPIO、读取传感器数据等等。如果外部系统需要调用Raspberry Pi,这是一个简单且清晰的解决方案。然而,您应该注意适当的身份验证,以确保不是每个人都可以远程控制Raspberry Pi。

作为Python REST API的替代方案,有诸如MQTT之类的解决方案:如果只需要传输/接收数据,并且没有公共API,MQTT是一个不错的选择。如果我们仍然需要API,也可以使用Node.JS来切换GPIO。总的来说,我觉得通过Python的解决方案更加舒适,而且它拥有最多的兼容扩展。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • GPIO
    +关注

    关注

    16

    文章

    1313

    浏览量

    55729
  • 树莓派
    +关注

    关注

    122

    文章

    2069

    浏览量

    109711
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    树莓控制gpio

    树莓在哪里编写程序控制gpio引脚
    发表于 07-23 09:05

    为什么树莓GPIO输入的时候会出现错误?

    我用的python控制的树莓 下面是代码 import RPi.GPIO as GPIO import time
    发表于 10-29 05:55

    详解树莓gpio功能及实用方法

    引脚编号之间的对应规则。对于不同的树莓版本,编写的脚本文件也可能是无法通用的。  你可以使用下列代码(强制的)指定一种编号规则:  GPIO.setmode(
    发表于 05-23 07:00

    树莓gpio应用

    树莓现在越来越火,网上树莓的资料也越来越多。树莓源自英国,国外嵌入式开源领域具有良好的分享
    发表于 11-09 15:10 4517次阅读

    树莓gpio接口及编程方法

    树莓现在越来越火,网上树莓的资料也越来越多。树莓源自英国,国外嵌入式开源领域具有良好的分享
    发表于 11-22 11:54 7w次阅读

    树莓gpio有什么用_怎么用

    树莓现在越来越火,网上树莓的资料也越来越多。树莓源自英国,国外嵌入式开源领域具有良好的分享
    发表于 12-06 09:05 1.6w次阅读

    树莓GPIO入门07-利用声音传感器制作声控灯

    GPIO4LED长针 - 树莓GPIO17LED短针 - 树莓
    发表于 04-02 14:41 2656次阅读

    用网页控制树莓GPIO引脚

    电子发烧友网站提供《用网页控制树莓GPIO引脚.zip》资料免费下载
    发表于 11-16 14:57 1次下载
    用网页控制<b class='flag-5'>树莓</b><b class='flag-5'>派</b>的<b class='flag-5'>GPIO</b>引脚

    树莓控制PWM控制电机转速

    python库配置 安装GPIO库 sudo apt-get install python3-rpi.gpio 电机控制程序 import time import RPi.GPIO as GP
    发表于 03-31 10:59 3次下载
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>控制PWM控制电机转速

    树莓接继电器的使用

    1.查看树莓的针脚 gpio readall  2.连线    我们需要把继电器的VCC 连到树莓3.3V的针脚、GND连到0V的针脚、
    发表于 04-26 11:40 0次下载
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>接继电器的使用

    使用树莓GPIO点亮双色LED灯

    上一篇文章向大家介绍树莓的硬件部分、安装操作系统及基础设置。这篇文章将介绍树莓的强大的开发功能口——GPIO,以及利用
    的头像 发表于 07-04 11:34 3670次阅读
    使用<b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>GPIO</b>口<b class='flag-5'>点亮</b>双色LED灯

    基于树莓点亮RGB三基色LED灯

    上一篇实现了树莓的第一个基础实验——点亮双色LED灯,并了解了树莓GPIO的基本用法。如果你
    的头像 发表于 07-04 11:34 3087次阅读
    基于<b class='flag-5'>树莓</b><b class='flag-5'>派</b><b class='flag-5'>点亮</b>RGB三基色LED灯

    树莓gpio有什么用,树莓gpio接口及编程方法

    /Output,通用输入/输出)是树莓提供的一组可编程的引脚,是树莓与外部世界进行交互的重要桥梁。通过
    的头像 发表于 10-22 18:09 3762次阅读

    GPIO树莓中的应用

    直接控制和读取外部硬件设备的状态。 1. GPIO简介 GPIO树莓派上用于与外部世界交互的一组引脚。这些引脚可以被配置为输入或输出模式,从而实现对外部设备的控制和数据读取。
    的头像 发表于 01-09 09:41 1252次阅读

    你真的懂树莓5嘛?树莓5引脚图全面指南:理解GPIO引脚及其功能!

    树莓5上的GPIO通用输入/输出(GPIO)引脚是树莓派上的物理连接器,允许树莓
    的头像 发表于 07-04 15:27 2426次阅读
    你真的懂<b class='flag-5'>树莓</b><b class='flag-5'>派</b>5嘛?<b class='flag-5'>树莓</b><b class='flag-5'>派</b>5引脚图全面指南:理解<b class='flag-5'>GPIO</b>引脚及其功能!