树莓派 GPIO口控制双色LED灯

2023-11-09

目录

一、首先加载库

二、设置编码规范

三、去除GPIO口警告

四、进行详细编程

五、程序源码


GPIOGeneral Purpose I/O Ports)意思为通用输入/输出端口,通过它们可以输出高低电平或者通过它们读入引脚的状态(是高电平或是低电平)。

树莓派对于GPIO的操作主要基于RPi.GPIO,这个库是树莓派系统自带的。

一、首先加载库

import RPi.GPIO as GPIO

二、设置编码规范

GPIO.setmode(mode)mode常用的参数有两个值,GPIO.BOARDGPIO.BCM。注意全是大写

1BOARD 从左到右,从上到下:左边基数,右边偶数:1-40。是告诉程序按物理位置找GPIO头(或者叫channel),优点就是方便找。

2BCM:编号侧重 CPU 寄存器,根据 BCM2835 GPIO 寄存器编号,按GPIO号,优点就是方便程序在不同的树莓派版本上跑。

3wpi: 编号侧重实现逻辑,把扩展 GPIO 端口从 0 开始编号,这种编号方便编程。这个库的开发语言是C语言,我们一般用python,所以一般用不到

具体原理图如下:

如果我们想看自己板子的GPIO口的原理图的话,我们有以下办法:

  1-“gpio -v”看下我们树莓派内置的版本。

  2-输入“gpio readall”查看我们接口编号的定义。

这里就不做截图,我们可以输入命令自己去看。

三、去除GPIO口警告

GPIO.setwarnings(False)

这一步倒是可有可无,如果不加的话,我们在调试的过程中可能会遇到一个警告,警告的内容大体如下:

RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.

出现这个警告并不影响程序的执行,主要是因为检测到12号管脚被占用了。我们也可以通过代码禁掉这个警告。

四、进行详细编程

首先是设置GPIO口的输出模式 ,再创建两个PWM实例,p_Rp_G

下面是PWM波中常用的几个函数:

创建一个 PWM 实例:

p = GPIO.PWM(channel, frequency),参数为:GPIO口、频率。

启用 PWM

p.start(dc) # dc 代表占空比(范围:0.0 <= dc >= 100.0)

更改频率:

p.ChangeFrequency(freq) # freq 为设置的新频率,单位为 Hz

更改占空比:

p.ChangeDutyCycle(dc) # 范围:0.0 <= dc >= 100.0

停止 PWM

p.stop()

注意,如果实例中的变量“p”超出范围,也会导致 PWM 停止。

五、程序源码

实现目的:颜色识别和GPIO口交互  与前面那篇博文相结合,上一篇博文链接:

opencv--可选颜色物体追踪函数_Haohao fighting!的博客-CSDN博客

这次设置编码规范应用的是BCM编码规范,我们通过更改redLed的值来改变GPIO口的引脚,我们在板子上连接的是GPIO21.所以redLed的值就是21.BCM编码规范中,板子上的管脚编号是多少我们就让redLed的值是多少)

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

# import the necessary packages
from __future__ import print_function
from imutils.video import VideoStream
import argparse
import imutils
import time
import cv2
import RPi.GPIO as GPIO

# initialize GPIO
redLed = 21
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(redLed, GPIO.OUT)

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--picamera", type=int, default=-1,
	help="whether or not the Raspberry Pi camera should be used")
args = vars(ap.parse_args())

# initialize the video stream and allow the camera sensor to warmup
print("[INFO] waiting for camera to warmup...")
vs = VideoStream(usePiCamera=args["picamera"] > 0).start()
time.sleep(2.0)

# define the lower and upper boundaries of the object
# to be detected in the HSV color space
colorLower = (24, 100, 100) 
colorUpper = (44, 255, 255) 

# Start with LED off
print("\n Starting..... ==> Press 'q' to quit Program \n")
GPIO.output(redLed, GPIO.LOW)
ledOn = False

# loop over the frames from the video stream
while True:
	# grab the next frame from the video stream, Invert 180o, resize the
	# frame, and convert it to the HSV color space
	frame = vs.read()
	frame = imutils.resize(frame, width=500)
	frame = imutils.rotate(frame, angle=0)
	hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

	# construct a mask for the obect color, then perform
	# a series of dilations and erosions to remove any small
	# blobs left in the mask
	mask = cv2.inRange(hsv, colorLower, colorUpper)
	mask = cv2.erode(mask, None, iterations=2)
	mask = cv2.dilate(mask, None, iterations=2)

	# find contours in the mask and initialize the current
	# (x, y) center of the object
	cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
		cv2.CHAIN_APPROX_SIMPLE)
	cnts = cnts[0] if imutils.is_cv2() else cnts[1]
	center = None

	# only proceed if at least one contour was found
	if len(cnts) > 0:
		# find the largest contour in the mask, then use
		# it to compute the minimum enclosing circle and
		# centroid
		c = max(cnts, key=cv2.contourArea)
		((x, y), radius) = cv2.minEnclosingCircle(c)
		M = cv2.moments(c)
		center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))

		# only proceed if the radius meets a minimum size
		if radius > 10:
			# draw the circle and centroid on the frame,
			# then update the list of tracked points
			cv2.circle(frame, (int(x), int(y)), int(radius),
				(0, 255, 255), 2)
			cv2.circle(frame, center, 5, (0, 0, 255), -1)

			# if the led is not already on, turn the LED on
			if not ledOn:
				GPIO.output(redLed, GPIO.HIGH)
				ledOn = True

	# if the object is not detected, turn the LED off
	elif ledOn:
		GPIO.output(redLed, GPIO.LOW)
		ledOn = False

	# show the frame to our screen
	cv2.imshow("Frame", frame)
	key = cv2.waitKey(1) & 0xFF

	# if the 'q' key is pressed, stop the loop
	if key == ord("q"):
		break

# do a bit of cleanup
print("\n Exiting Program and cleanup stuff \n")
GPIO.cleanup()
cv2.destroyAllWindows()
vs.stop()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派 GPIO口控制双色LED灯 的相关文章

  • 如何使用 pyinstaller 包含文件?

    我也使用 tkinter 使用 python 3 7 编写了一个程序 由于我使用的是外部图片 因此当我将所有内容编译为一个 exe 时 我需要包含它们 我试过做 add data bg png files 但我仍然收到此错误 tkinter
  • 如何使用 VSCode 调试 Linux 核心转储?

    我故意从我使用 VSCode 编写的 C 应用程序生成核心转储 我不知道如何调试核心转储 有没有人愿意分享这方面的经验 更新 我相信我现在已经可以使用了 我为核心文件创建了第二个调试配置 我需要添加指向生成的转储文件的 coreDumpPa
  • 将 numpy 数组写入文本文件的速度

    我需要将一个非常 高 的两列数组写入文本文件 而且速度非常慢 我发现如果我将数组改造成更宽的数组 写入速度会快得多 例如 import time import numpy as np dataMat1 np random rand 1000
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 如何在 PyCharm 4.5.2 中使用 PyPy 作为标准/默认解释器?

    如何在 PyCharm 4 5 2 中使用 PyPy 作为标准 默认解释器 一切都在 Ubunutu 14 10 下运行 并且 pypy 已经安装 您可以在项目的设置下进行配置 这个官方文档直接涵盖了 https www jetbrains
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • `list()` 被认为是一个函数吗?

    list显然是内置类型 https docs python org 3 library stdtypes html list在Python中 我看到底下有一条评论this https stackoverflow com a 53645813
  • 如何使用 sys.path.append 在 Python 中导入文件?

    我的桌面上有两个目录 DIR1 and DIR2其中包含以下文件 DIR1 file1 py DIR2 file2 py myfile txt 这些文件包含以下内容 file1 py import sys sys path append s
  • 使用 numpy 在 python 中执行最大方差旋转

    我正在研究矩阵的主成分分析 我已经找到了如下所示的组件矩阵 A np array 0 73465832 0 24819766 0 32045055 0 3728976 0 58628043 0 63433607 0 72617152 0 5
  • 在 Sphinx 中,有没有办法在声明参数的同时记录参数?

    我更喜欢在声明参数的同一行记录每个参数 根据需要 以便应用D R Y http en wikipedia org wiki Don t repeat yourself 如果我有这样的代码 def foo flab nickers a ser
  • 由于 json 字符串化 dict 键导致数据丢失

    考虑下面的例子 gt gt gt import json gt gt gt d 0 potato 0 spud gt gt gt json dumps d 0 potato 0 spud gt gt gt json loads json d
  • 如何将回溯/sys.exc_info() 值保存在变量中?

    我想将错误名称和回溯详细信息保存到变量中 这是我的尝试 import sys try try print x except Exception ex raise NameError except Exception er print 0 s
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac
  • 使用 urllib 编码时保持 url 参数有序

    我正在尝试用 python 模拟 get 请求 我有一个参数字典 并使用 urllib urlencode 对它们进行 urlencode 我注意到虽然字典的形式是 k1 v1 k2 v2 k3 v3 urlencoding 后参数的顺序切

随机推荐

  • catalina 无法验证macos_macOS 10.15 Catalina无法打开app,提示“因为无法确认开发者身份”问题的解决方法......

    概述 本文最后更新 2020年5月4日 不少用户升级到macOS Catalina 10 15之后 遇到了网上下载的app无法运行的问题 出现以下几种提示 无法打开 xxx 因为无法确认开发者的身份 xxx 已损坏 无法打开 您应该将它移到
  • Java比较器

    一 Java比较器的概述 1 为什么要使用比较器 当java涉及到数组排序时 就会使用到比较器 import java util Arrays public class ComparableTest1 public static void
  • Java常见问题(1)navicat连接mysql报2059错误

    一 navicat连接mysql8后出现2059报错原因 使用navicat连接mysql数据库的时候 弹出2059错误 如下图所示 出现的原因是mysql8安装选择了强加密规则caching sha2 password 而mysql8之前
  • 买了一年CSDN年VIP,用着实在太爽!

    买一年CSDN的年VIP有多爽及使用攻略 一 前言 这段时间 一旦打开CSDN就不断的弹出618活动 在电脑网上打开 一股白嫖之的气息吹来 让人直接忍不住剁手 最后经过近5天的挣扎 我还是受不了CSDN的蛊惑 618不买衣服不买裤子 不买键
  • 链接器工具错误 LNK2005———— 符号 被定义了多次。

    出错函数为void BinaryTree test 如下 1 该函数在BInarySearchTree h中声明如下 void BinaryTree test 2 该函数在BInarySearchTree cpp中定义 如下 void Bi
  • 2021美赛A题

    2021百万 问题A 真菌 碳循环描述了整个地球化学过程中碳的交换过程 是地球生命的重要组成部分 碳循环的一部分包括 化合物的分解 使碳得以更新并以其他形式使用 一键 这一过程的组成部分是植物材料和木质纤维的分解 分解木质纤维的一些关键因素
  • 学习笔记(Putty使用指南)

    下载 Putty是用来远程连接服务器的 支持SSH Telnet Serial等协议的连接 其中最常用的是SSH 下载链接 链接 https pan baidu com s 1RpJCgizhzxBvc7VVdYxDFg 提取码 4v23
  • valgrind massif 分析内存问题

    旧博文 搬到 csdn 原文 http rebootcat com 2020 06 16 valgrind massif memory analysing Valgrind Massif valgrind 是什么 这里直接引用其他人的博客
  • 戴尔服务器重装系统的方法,Dell服务器安装操作系统四种方法.doc

    Dell服务器安装操作系统四种方法 doc Dell服务器安装操作系统四种方法PowerEdge服务器手动安装操作系统 适合有软驱软盘 硬盘有数据要保留的用户 Dell PowerEdge 1950 服务器 Windows 2003安装手册
  • 优美的讲解equals和==的区别

    初步了解在JVM中的内存分配知识 在JVM中 内存分为堆内存跟栈内存 他们二者的区别是 当我们创建一个对象 new Object 时 就会调用对象的构造函数来开辟空间 将对象数据存储到堆内存中 与此同时在栈内存中生成对应的引用 当我们在后续
  • 【Python】Stegano包:一个纯Python的隐写模块,提供不同的隐写和隐写分析方法

    文章目录 一 介绍 二 安装 三 使用 Stegano 作为 Python 模块 3 1 LSB method 3 2 LSB method with sets 3 3 图片的描述字段 一 介绍 隐写术是一门以这样的方式编写隐藏消息的艺术和
  • Type ‘string‘ is not assignable to type ‘“xx1“

    新手常遇typescript类型约束报错 是宽泛的字符串约束和具体值的类型约束的问题 使用as const 解决 原理详细如下 https blog csdn net weixin 43263355 article details 1209
  • java 对象多属性排序_java – 按多个属性对对象排序

    我一直在研究一些需要我按三个属性 软件 str 颜色 str 和体积 int 对物体 软饮料 进行分类的东西 我已经研究过 并找到了通过名称 颜色和体积分别订购它们的方法 但有没有办法按三种方式订购它们 我的意思是 例如 假设有四个Soft
  • 用OpenCV-Python制作灯光秀短视频

    老猿Python博文目录 https blog csdn net LaoYuanPython 用OpenCV Python读取摄像头写入视频文件 一 引言 在 https blog csdn net LaoYuanPython articl
  • cucu: a compiler u can understand (part 2)

    原文地址 http blog csdn net roger wong article details 8502477 原文地址 http zserge com blog cucu part2 html 到目前为止 我们已经定义了我们语言的语
  • OpenWrt之U盘SD卡挂载overlay

    官方参考 挂载扩展存储脚本 bin sh 一键脚本挂载rootfs到SD卡 u盘则改mmcblk0p1为sda1 umount dev mmcblk0p1 mkfs ext4 dev mmcblk0p1 F mount dev mmcblk
  • ffmpeg 接收网络流并解码_FFmpeg编程入门系列(1)

    FFmpeg播放器框架 一个完整的播放器框架如下 媒体文件可以是本地文件 也可以是网络流 解复用器主要是分离出音视频包 音视频packet队列 这个是分开设计 为了匹配解复用器之间的速度以及防止网络抖动 音视频解码 主要是把packet数据
  • 14-数据结构-二叉树的创建以及前中后遍历,以及结点和叶子节点的计算(C语言)

    概述 二叉树 这里采用孩子链表存储法 即一个数据域和两个左右孩子指针域 随后递归进行遍历即可 在创建二叉树的时候 先创建各个二叉树结点 这里的结点采用动态分配 因此结点为指针变量 随后 再根据逻辑结构图 手动通过左右指针域 链接到对应位置即
  • 第六篇:数据可视化数据可视化技巧

    作者 禅与计算机程序设计艺术 1 简介 数据可视化 Data Visualization 是指将数据以图表 图像 信息地展示出来 对数据的分析结果 决策过程进行直观呈现 数据可视化是一种快速有效地帮助用户理解和发现数据关系和规律的方法 是理
  • 树莓派 GPIO口控制双色LED灯

    目录 一 首先加载库 二 设置编码规范 三 去除GPIO口警告 四 进行详细编程 五 程序源码 GPIO General Purpose I O Ports 意思为通用输入 输出端口 通过它们可以输出高低电平或者通过它们读入引脚的状态 是高