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

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

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

如图所示

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

安装一些插件,教我做人

https://copilot.github.com/

语言模式,就写Python

import urllibcontens = urllib.urlopen("www.baidu.com/").read()print(contens)

出错了

from urllib.request import urlopenwebpage = urlopen('http://www.python.org')print(webpage)

这个还算靠谱

import sysfor(i, value) in enumerate(sys.argv): print("arg:%d %s" % (i, value))

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

python.exe .\url.py a b c d

也可以这样执行

后面是捕获的参数

树莓派B+

另一个引脚图

https://pypi.org/project/RPi.GPIO/
https://github.com/zhongzhi107/raspberry-pi-tutorials
https://sourceforge.net/p/raspberry-gpio-python/code/ci/default/tree/

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

C文件

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

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

使用的方法是BCM

import RPi.GPIO as GPIOimport 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脚输出高低电平,中间是时间。

sudo python xxxx.py

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

import RPi.GPIO as GPIOimport time
buzzer_pin = 18GPIO.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脚的开关状态来工作,延迟时间用音调计算而来。

产生动静的代码

from Tkinter import *import RPi.GPIO as GPIOimport 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代码


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

写作思路

import tkintertop = tkinter.Tk()# 进入消息循环top.mainloop()

结果

# 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() # 进入消息循环

要使用的部件

控件共有的属性

几何管理方式

https://github.com/china-testing/python-api-tesing

一个py的api集成库

刚刚查资料看见的

https://github.com/china-testing/python-api-tesing/blob/master/books.md
https://china-testing.github.io/tk2.html

创建一个复选框

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

bool变量设置复选框的状态

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

https://zhuanlan.zhihu.com/p/75872830?from_voters_page=true

这里插个文章,还不错

python -m tkinter

cmd输入这个会出现对话框

https://tkdocs.com/tutorial/index.html

这个链接里面有大量的doc

https://wxpython.org/Phoenix/docs/html/index.html

还有别的库

https://wxpython.org/pages/overview/

有时间的去看吧

传递的command

我们使用到的组件

https://tcl.tk/man/tcl8.6/TkCmd/ttk_checkbutton.htm

具体的参数

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

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


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

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

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

from Tkinter import *import RPi.GPIO as GPIOimport 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


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

https://tkdocs.com/tutorial/morewidgets.html#scale

就这个

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

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

from Tkinter import *import RPi.GPIO as GPIOimport 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的类型

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

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灯

(0)

相关推荐

  • “物联网开发实战”学习笔记-(二)手机控制智能电灯

    如果搭建好硬件平台后,这一次我们的任务主要是调试好智能电灯,并且连接到腾讯云的物联网平台. 腾讯云物联网平台 腾讯物联网平台的优势: 腾讯云链接: link. 到物联网平台的原因这是因为物联网平台提供 ...

  • 用Python创建你第一个GIS程序[5]:多进程解决线程堵塞

    前言:在上一章中,我们将前后端连接起来,算是真正把程序给创建了出来.但是存在一个问题:当你点击"运行"按钮运行程序后,再用鼠标点击拖动 GUI 界面就会卡死... 线程堵塞 当点击 ...

  • 用Python创建你第一个GIS程序[3]:前后端搭建

    前言:为了区分说明,我们这里也用前端后端这个概念来阐述.本章节使用简单的案例,分别展示前后端的代码,包括一个简单前端 GUI 界面的搭建流程和代码. 后端 为了区分说明,我们这里也用前端后端这个概念来 ...

  • 用Python创建你第一个GIS程序[6]:python2.7 Tkinter 界面美化最终方案

    前言:有的人不喜欢 Tkinter 的一个重要原因就是其界面太丑,而我也偶尔觉得.在前后一年的时间中,针对 Tkinter 的美化尝试做了无数次,最终我选择了以下这种方案... 图形化按钮 使用图形化 ...

  • 【Python】 简单网络爬虫实现

    引言 网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人.其目的一般为编纂网络索引. --维基百科 网络爬虫可以将自己所访问的页面保存下来,以 ...

  • 为什么你的python版本一团糟?因为少了这个操作

    坑人的版本 Python 的版本问题一直是个广被吐槽的黑点.以至于有人调侃说: Python 是世界上最好的两种语言! 在这里我要说明下,对于初学者来说,版本间的语法差异其实并不大.现在刚开始学 Py ...

  • 树莓派GPIO控制/使用的教程

    介绍 使用说明 (一)导入库 (二)设置编码规范 (三)引脚设置 (四)电平控制 (五)读取引脚的输入状态 (六)释放GPIO资源 (七)示例代码 (八)PWM设置 一个树莓派小白,对GPIO的使用一 ...

  • PyAutoGUI:自动化键鼠操作的 Python 类库

    2021-09-07 有些朋友可能玩过按键精灵,一个用来操作键盘鼠标完成一些自动化工作的软件.其实如果你学了Python的话,完全用不着按键精灵这种东西了.因为广泛的Python类库里,就有PyAut ...

  • 十大经典排序算法 (Python版本)

    来源网络: https://github.com/hustcc/JS-Sorting-Algorithm 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排 ...

  • DL中版本配置问题:TensorFlow、Keras、Python版本完美搭配推荐

    DL中版本配置问题:TensorFlow.Keras.Python版本完美搭配推荐 TensorFlow.Keras.Python版本完美搭配推荐 TensorFlow 2.1.0 + Keras 2 ...

  • Anaconda切换python版本

    文章目录 anaconda navigator使用 命令行创建 踩坑点 CondaHTTPError: HTTP 000 CONNECTION FAILED for url conda activat ...

  • 初学Python版本选择

    选择32位还是64位? 除了面向政府.国企领域外都建议64位 新兴领域很多库都是纯64位的,比如谷歌Tensorflow.Taichi太极图形库等.为了以后有可能出现的学习需要,起始就安装64位的Py ...

  • 自动化篇 | 你想要的闲鱼日常操作,Python 给你实现了

    第一时间获取 Python 技术干货! 阅读文本大概需要 8 分钟. 1 目 标 场 景 前篇文章讲了如何在 iOS 端使用 Airtest 实现自动化的操作,本篇将继续带大家做 iOS 端的自动化项 ...

  • 解决jetson Nano中python版本问题(Ubuntu系统都适用)

    jetson 的环境搭建遇到了很多的问题,这里开帖子记录一下 sudo easy_install pip sudo apt-get install python3-pip 还有这个是最烦的问题,版本这 ...