首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >树莓派 GPIO操作.1(Python版本)

树莓派 GPIO操作.1(Python版本)

作者头像
云深无际
发布于 2021-07-23 05:03:12
发布于 2021-07-23 05:03:12
1.3K00
代码可运行
举报
文章被收录于专栏:云深之无迹云深之无迹
运行总次数:0
代码可运行

今天的最后一篇文章,一共7篇,很久没有写这么满了。后面的硬件就不测试了,大概率是正确的,我只写源代码。而且这些代码放在Jetson Nano上面也是可以的。

源码都是主机上面写的,环境是Python3.7:

如图所示

先安装urllib3,我以前写爬虫是2

安装一些插件,教我做人

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://copilot.github.com/

语言模式,就写Python

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import urllib
contens = urllib.urlopen("www.baidu.com/").read()
print(contens)

出错了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib.request import urlopen
webpage = urlopen('http://www.python.org')
print(webpage)

这个还算靠谱

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
for(i, value) in enumerate(sys.argv):
    print("arg:%d %s" % (i, value))

这是它的第一种用法,直接读取命令行的数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python.exe .\url.py a b c d

也可以这样执行

后面是捕获的参数

树莓派B+

另一个引脚图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://pypi.org/project/RPi.GPIO/
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/zhongzhi107/raspberry-pi-tutorials
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://sourceforge.net/p/raspberry-gpio-python/code/ci/default/tree/

源文件是C的,应该是包装了Python的接口

C文件

py_gpio.py看上去都是C的实现,包装了一个接口

这样只能尽可能的快了,差不多够用吧

使用的方法是BCM

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)

while (True):
    GPIO.output(18, True)
    time.sleep(0.5)
    GPIO.output(18, False)
    time.sleep(0.5)

LED闪烁的程序


用到了io和time,先设置IO的map方式,然后是引脚。接着死循环,交替的让18脚输出高低电平,中间是时间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo python xxxx.py

和内核态打交道,记得给sudo的权限,下面都是这样的运行方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import RPi.GPIO as GPIO
import time

buzzer_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)


def buzz(pitch, duration):
    period = 1.0 / pitch
    delay = period / 2
    cycles = int(duration * pitch)
    for i in range(cycles):
        GPIO.output(buzzer_pin, True)
        time.sleep(delay)
        GPIO.output(buzzer_pin, False)
        time.sleep(delay)


while True:
    pitch_s = print("输入音高 (200 到 2000): ")
    pitch = float(pitch_s)
    duration_s = print("输入持续时间(秒):")
    duration = float(duration_s)
    buzz(pitch, duration)

蜂鸣器


原理是很简单,通过快速的改变18脚的开关状态来工作,延迟时间用音调计算而来。

产生动静的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from Tkinter import *
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)


class App:

    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        self.check_var = BooleanVar()
        check = Checkbutton(frame, text='Pin 18',
                            command=self.update,
                            variable=self.check_var, onvalue=True, offvalue=False)
        check.grid(row=1)

    def update(self):
        GPIO.output(18, self.check_var.get())


root = Tk()
root.wm_title('On / Off Switch')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()

一个控制开关的GUI代码


需要掌握的知识有点多,先写写看。

写作思路

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tkinter
top = tkinter.Tk()
# 进入消息循环
top.mainloop()

结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Python3.x 导入方法
from tkinter import *
root = Tk()                     # 创建窗口对象的背景色
# 创建两个列表
li = ['C', 'python', 'php', 'html', 'SQL', 'java']
movie = ['CSS', 'jQuery', 'Bootstrap']
listb = Listbox(root)  # 创建两个列表组件
listb2 = Listbox(root)
for item in li:                 # 第一个小部件插入数据
    listb.insert(0, item)

for item in movie:              # 第二个小部件插入数据
    listb2.insert(0, item)

listb.pack()                    # 将小部件放置到主窗口中
listb2.pack()
root.mainloop()                 # 进入消息循环

要使用的部件

控件共有的属性

几何管理方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/china-testing/python-api-tesing

一个py的api集成库

刚刚查资料看见的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/china-testing/python-api-tesing/blob/master/books.md
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://china-testing.github.io/tk2.html

创建一个复选框

通过传递值,来改变复选框的状态

bool变量设置复选框的状态

传递的函数,在这里和硬件产生的关联

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://zhuanlan.zhihu.com/p/75872830?from_voters_page=true

这里插个文章,还不错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m tkinter

cmd输入这个会出现对话框

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://tkdocs.com/tutorial/index.html

这个链接里面有大量的doc

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://wxpython.org/Phoenix/docs/html/index.html

还有别的库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://wxpython.org/pages/overview/

有时间的去看吧

传递的command

我们使用到的组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://tcl.tk/man/tcl8.6/TkCmd/ttk_checkbutton.htm

具体的参数

最后注意使用mainloop()不然不出现现窗口

定义了一个App的类,如果你有两个函数需要一起管理就考虑类吧


初始化的韩苏护创建一个check_var的成员变量,包含了一个bool的变量,未组件实现了变量选项。

保证了你鼠标点复选框的时候,变量的值会改变。

command的参数会在发生改变的似乎运行updata的函数,至于updata函数这不是有手就行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from Tkinter import *
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 500)
pwm.start(100)


class App:

    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        scale = Scale(frame, from_=0, to=100,
                      orient=HORIZONTAL, command=self.update)
        scale.grid(row=0)

    def update(self, duty):
        pwm.ChangeDutyCycle(float(duty))


root = Tk()
root.wm_title('PWM Power Control')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()

控制一个引脚的PWM输出,我又写了一个GUI


和上个写法一样,不过用了一个新的组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://tkdocs.com/tutorial/morewidgets.html#scale

就这个

同样写了App的类和一个update的函数,直接输出一个duty的参数控制

滑块变,执行update函数,然后回导致duty变,最后导致PWM的占空比变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from Tkinter import *
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)

pwmRed = GPIO.PWM(18, 500)
pwmRed.start(100)

pwmGreen = GPIO.PWM(23, 500)
pwmGreen.start(100)

pwmBlue = GPIO.PWM(24, 500)
pwmBlue.start(100)


class App:

    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        Label(frame, text='Red').grid(row=0, column=0)
        Label(frame, text='Green').grid(row=1, column=0)
        Label(frame, text='Blue').grid(row=2, column=0)
        scaleRed = Scale(frame, from_=0, to=100,
                         orient=HORIZONTAL, command=self.updateRed)
        scaleRed.grid(row=0, column=1)
        scaleGreen = Scale(frame, from_=0, to=100,
                           orient=HORIZONTAL, command=self.updateGreen)
        scaleGreen.grid(row=1, column=1)
        scaleBlue = Scale(frame, from_=0, to=100,
                          orient=HORIZONTAL, command=self.updateBlue)
        scaleBlue.grid(row=2, column=1)

    def updateRed(self, duty):
        pwmRed.ChangeDutyCycle(float(duty))

    def updateGreen(self, duty):
        pwmGreen.ChangeDutyCycle(float(duty))

    def updateBlue(self, duty):
        pwmBlue.ChangeDutyCycle(float(duty))


root = Tk()
root.wm_title('RGB LED Control')
app = App(root)
root.geometry("200x150+0+0")
root.mainloop()

趁热打铁,来个RGB的控制代码

一目了然对吧?

初始化三个脚

代码有点不好,没有用生成器写

和上面一样,注意运行的时候看你的RGB的类型

共阳极还是共阴极,如果是漫射型的会更好

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import RPi.GPIO as GPIO

pins = [18, 23, 24]

pin_led_states = [
    [1, 0, -1],  # A
    [0, 1, -1],  # B
    [-1, 1, 0],  # C
    [-1, 0, 1],  # D
    [1, -1, 0],  # E
    [0, -1, 1]  # F
]

GPIO.setmode(GPIO.BCM)


def set_pin(pin_index, pin_state):
    if pin_state == -1:
        GPIO.setup(pins[pin_index], GPIO.IN)
    else:
        GPIO.setup(pins[pin_index], GPIO.OUT)
        GPIO.output(pins[pin_index], pin_state)


def light_led(led_number):
    for pin_index, pin_state in enumerate(pin_led_states[led_number]):
        set_pin(pin_index, pin_state)


set_pin(0, -1)
set_pin(1, -1)
set_pin(2, -1)

while True:
    x = int(raw_input("Pin (0 to 5):"))
    light_led(x)

接着我们看一个有趣的东西,众所周知,IO脚和珍贵

那么如何用少的IO控制尽可能多的灯呢?



利用GPIO引脚在运行过程中可以随意改变输入输出的原理。我突然不想解释了,LED=n^2-n,10个脚可以控制90个LED。在上面的demo的里面是一次点亮一个,需要多个点亮是,将要点亮的led放数组,然后快速循环,来欺骗你的eye。

大纲

直接看这个配置,数组,不多。列表保存的GPIO

设置引脚

led灯

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
树莓派综合项目3:AI视觉机械臂小车(三)基本运动
树莓派综合项目3:AI视觉机械臂小车(一)蜂鸣器 树莓派综合项目3:AI视觉机械臂小车(二)轻触按键   本实验将实现履带车的基本运动,前进、后退、左转、右转。在以前的文章中有更基础细致的讲解可以参考: 树莓派基础实验34:L298N模块驱动直流电机实验 树莓派综合项目2:智能小车(一)四轮驱动
张国平
2021/05/17
1.9K1
树莓派综合项目3:AI视觉机械臂小车(三)基本运动
树莓派4b c语言,【树莓派4B学习】七、树莓派4B的GPIO基础操作
链接:https://pan.baidu.com/s/1icgrCoc-piC0Eid0NlRlMA 提取码:6h0b
全栈程序员站长
2022/09/02
2.5K0
树莓派4b c语言,【树莓派4B学习】七、树莓派4B的GPIO基础操作
树莓派基础实验22:红外遥控传感器实验
   红外接收头的主要功能为IC化的一种受光元件,其内部是将光电二极管(俗称接收管)和集成IC共同组合封装而成,其IC设计主要以类比式控制,一般主要接收38KHZ的频率的红外线,而对其他频率段的红外信号不敏感。这样,遥控器发出载波在38KHZ的频率,接收管接受遥控器发送过来的信息,从而构成通讯。
张国平
2020/09/27
2.5K0
简单WiFi控制小车系统(树莓派+python+web控制界面)
   蛇皮走位演示视频: https://pan.baidu.com/s/1RHHr8bRHWzSEAkrpwu99aw
Fivecc
2022/11/21
1.7K0
简单WiFi控制小车系统(树莓派+python+web控制界面)
4步实现树莓派人脸识别、拍照与推送、舵机旋转
大部分童鞋的树莓派是不是一直在吃灰呢?一直闲置着,倒不如用它做一个简易监控,如果检测到人脸后,就拍照上传到指定地方,或发消息提醒。
小锋学长生活大爆炸
2022/03/29
7760
4步实现树莓派人脸识别、拍照与推送、舵机旋转
树莓派开发实例:基于树莓派的智能植物灌溉系统
作为物联网领域的重要一员,树莓派凭借其小巧的体积、强大的功能和丰富的接口,成为了众多开发者青睐的对象。本文将详细介绍一个基于树莓派的智能植物灌溉系统的开发实例,展示树莓派在物联网应用中的强大潜力。
china马斯克
2025/01/10
5110
树莓派从温湿度传感器DHT11读取数据
树莓派作为一个完整的主机,除了能在上面跑系统外,也提供了40个引脚提供电路开发的功能。本来我在工作中常接触linux,但没啥机会接触硬件,正好手头上有一台raspberry 3b,本来是用来学linux相关的包的,闲的没事,网上买了几个传感器玩玩。很短时间就能上手从dht11读取数据了,虽然也看了好多文档,GPIO学起来还是挺简单的。   第一次写gpio程序, 我还是参考了别人的代码,主题代码基本一样,这里我多解释下我的代码吧。 重要的是这里有几个magic number,比如cnt 小于100和cnt > 12。     首先我们可以在网上找下DHT11的相关文档。你向传感器发送一个复位信号(大于18us的低电位,然后高电位),然后传感器会传送40-50us的低电位,紧接着40-50us的高电位。在往后就是以12-14us间隔的40个数据位了。   40个数据位编码方式如下。
xindoo
2021/01/21
1.3K0
树莓派综合项目2:智能小车(二)tkinter图形界面控制
树莓派综合项目2:智能小车(一)四轮驱动中,实现了代码输入对四个电机的简单控制,本章将使用Python 的图形开发界面的库——Tkinter 模块(Tk 接口),编写本地运行的图形界面,控制小车的前进后退、转向和原地转圈。
张国平
2020/09/27
3.1K0
树莓派综合项目2:智能小车(二)tkinter图形界面控制
树莓派综合项目2:智能小车(一)四轮驱动
树莓派的小项目中,我首选了智能小车这个项目作为我探索的第一个目标,因为和很多小朋友一样,对遥控小汽车有种喜欢,特别是有过小时候欲求而不得的经历的大人们哈。
张国平
2020/09/27
3.7K0
树莓派综合项目2:智能小车(一)四轮驱动
树莓派基础实验9:蜂鸣器实验
   蜂鸣器是音频信号装置,蜂鸣器可分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器直接接上额定电源就可以连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能周期性地振动发声。
张国平
2020/09/27
4K0
【极客大讲堂】如何用树莓派控制交通红绿灯?
涉及硬件:树莓派以及相关套件、LED红绿灯 涉及知识:电路实验板、CanaKit 当准备好以上,我们就可以开始啦。使用树莓派进行LED原型控制。 首先要明白的是,接入所有的电线、电阻器以及工具包附带的指示灯需要谨慎操作,毕竟如果你设置操作不当将有可能损坏你的硬件。 为了简化与树莓派和LED的接触,也为了方便编写控制代码,我决定编写一个叫做Pi交通灯的小玩意,这是用树莓派控制LED的第一步。 有了这个“红绿灯”之后,你要做的就只是把这个小装置直接插到树莓派的GPIO接口上。你不需要担心连接到线路板
FB客服
2018/02/07
2K0
【极客大讲堂】如何用树莓派控制交通红绿灯?
云中树莓派(4):利用声音传感器控制Led灯
将 VCC 引脚接入树莓派 5V 引脚,将 GND 引脚接入树莓派 GND 引脚,将 OUT 引脚接入树莓派 GPIO20。
SammyLiu
2019/06/28
1.3K0
云中树莓派(4):利用声音传感器控制Led灯
树莓派基础实验1:双色LED灯实验
   双色发光二极管(LED)能够发出红色和绿色,两种不同颜色的光。正电压指向LED端子之一,使LED发出相应的颜色的光,一次只能有一个引脚接受电压,常用着各种设备的指示灯。
张国平
2020/09/28
3.9K0
树莓派基础实验1:双色LED灯实验
树莓派读取DHT11温湿度数据 Python
DHT11是一款有已校准数字信号输出的温湿度传感器。其精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~ 50℃。精度不高,但价格低廉。 DHT11使用单总线通信。供电电压3.3~5V。
zeruns
2021/04/26
9520
树莓派读取DHT11温湿度数据 Python
树莓派4使用Python通过GPIO从DHT11温湿度传感器读取数据
DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~ 50℃。精度不高,但价格低廉。 DHT11使用单总线通信。供电电压3.3~5V。
zeruns
2021/04/14
4.1K0
树莓派4使用Python通过GPIO从DHT11温湿度传感器读取数据
树莓派&旭日X3派通过TCP指令控制继电器的通断
小黑鸭
2023/10/16
2820
树莓派&旭日X3派通过TCP指令控制继电器的通断
用NVIDIA Jetson Orin NANO做一个星球大战机器人
在星际大战的宇宙里,沙坑机器人(Pit Droids)简直就是维修达人,专门负责护航赛车“超级赛车”(podracers)的保养。这帮机器小伙伴们个头不高,只有1.2米,不使用时可以折叠起来,非常可爱!
GPUS Lady
2023/08/15
5980
树莓派基础实验5:激光传感器实验
   由于其良好的指向性和能量集中性,激光广泛用于医疗军事等领域,顾名思义,激光发射模块是一种可以发射激光的模块。
张国平
2020/09/28
1.5K0
树莓派基础实验5:激光传感器实验
树莓派综合项目3:AI视觉机械臂小车(二)轻触按键
树莓派综合项目3:AI视觉机械臂小车(一)蜂鸣器 树莓派基础实验   本实验也是一个简单的轻触按键实验,在基础实验系列中讲过类似的一篇,树莓派基础实验6:轻触开关按键实验,当中使用了 interrupt( 中断 )式( edge detection 边缘检测 ),GPIO.add_event_detect()方法。本实验中直接使用While循环检测按键输入的电平为高还是低,同时介绍一个Python控制GPIO的库“gpiozero”,gpiozero库的操作更加人性化,而且简单好用、易于上手,树莓派镜像默认安装了gpiozero库,无需额外安装。
张国平
2021/05/13
1.4K0
树莓派综合项目3:AI视觉机械臂小车(二)轻触按键
树莓派综合项目1:智能温度测量系统实验
  我们可以在编程时通过操纵杆PS2调整下限和上限值。操纵杆PS2有五个操作方向:向上、向下、向左、向右和向下按压。在这个项目中,我们将使用左右方向来控制上限值,上下方向来控制下限值。如果按一下操纵杆,系统将退出。
张国平
2020/09/27
1.4K1
推荐阅读
相关推荐
树莓派综合项目3:AI视觉机械臂小车(三)基本运动
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验