赞
踩
【准备工作】
首先准备一个能正常使用的树莓派,远程登录或者接屏幕都随意,这不是重要的。
(笔者使用的是树莓派3B+)
焊接一个电阻+小灯珠的简易电路,接到树莓派对应的GPIO,类似下图
【操作方法】
首先附上树莓派的引脚对照表:(注意,下图中每个GPIO对应了三种不同的编码)
附带介绍一种方法可以直接输入命令查询GPIO引脚编号:
此工具由GPIO Zero Python库提供,默认情况下,它安装在Raspbian桌面映像上,但不安装在Raspbian Lite上。
打开终端输入命令 pinout
看到引脚对照表中的3种编码,实际上也对应了3种控制GPIO的方式,树莓派内核中已经编译自带了 gpio 的驱动,我们只需通过一些第三方写好的库函数来完成具体的操作,即可控制相应外设,比较常见的操作库函数有:
python GPIO
开发语言——python
简单介绍——树莓派官方资料中推荐且容易上手。python GPIO 是一个小型的 python 库,可以帮助用户完成 raspberry 相关 IO 口操作,但是 python GPIO 库还没有支持 SPI、I2C 或者 1-wire 等总线接口。
官方网站—— https://code.google.com/p/raspberry-gpio-python/
wiringPi
开发语言——C 语言
简单介绍——wiringPi 适合那些具有 C 语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi 的 API 函数和 arduino 非常相似,这也使得它广受欢迎。作者给出了大量的说明和示例代码,这些示例代码也包括 UART 设备,I2C 设备和 SPI 设备等。
官方网站—— http://wiringpi.com/
BCM2835 C Library
开发语言——C 语言
简单介绍——BCM2835 C Library 可以理解为使用C语言实现的相关底层驱动,BCM2835 C Library 的驱动库包括 GPIO、SPI 和 UART 等,可以通过学习 BCM2835 C Library 熟悉 BCM2835 相关的寄存器操作。如果有机会开发树莓派上的 linux 驱动,或自主开发 python 或 PHP 扩展驱动,可以从 BCM2835 C Library 找到不少的“灵感”。
官方网站—— http://www.airspayce.com/mikem/bcm2835/
本文暂时只介绍使用Python控制GPIO,树莓派基本都预装好了Python的GPIO库。
1、安装Python RPI.GPIO库
带桌面的版本已经安装了Python RPI.GPIO库,测试有没有安装:
在终端打开 Python3
在shell中输入命令尝试导入库: import RPi.GPIO as GPIO 。如果没有出现error,就表示已经安装了,可以直接跳到下一步。
如果出现错误,则执行以下命令:
sudo apt-get update
sudo apt-get install python3-rpi.gpio
2、编写代码
在桌面新建文件led_test.py,名字和路径随意。新建完成后直接双击打开,也可以在SSH登录操作,用nano或vim编辑即可。
编写代码如下:
#!/usr/bin/python3 # -*- coding: utf-8 -*- #通过声明可以在程序中书写中文 import RPi.GPIO as GPIO #引入RPi.GPIO库函数命名为GPIO import time #引入计时time函数 GPIO.setmode(GPIO.BCM) #将GPIO编程方式设置为BCM模式 GPIO.setup(17, GPIO.OUT) #将GPIO引脚17设置为输出引脚 GPIO.output(17, GPIO.LOW) #拉低关灯 blinks = 0 print('开始闪烁') while (blinks < 5): #闪烁5次 GPIO.output(17, GPIO.HIGH) time.sleep(1.0) #延时1秒 GPIO.output(17, GPIO.LOW) time.sleep(1.0) blinks = blinks + 1 GPIO.output(18, GPIO.LOW) #拉低关灯 GPIO.cleanup() #重置 GPIO 接口 print('结束闪烁')
注意:
GPIO.setmode() 有两种参数可以选择:可以使用 GPIO.BOARD 选项告诉库根据 GPIO 接口的引脚号引用信号,或者使用 Broadcom 芯片的信号编号( GPIO.setmode(GPIO.BCM) )。
GPIO.cleanup() 用于重置 GPIO 接口,它把所有的 GPIO 引脚设置为低电平状态,所以没有多余的信号出现在界面上。在不使用改函数的情况下,如果试图配置一个已分配信号值的 GPIO 信号引脚,那么 RPi.GPIO 模块会产生一条警告信息。
3、运行程序
依次输入命令
cd ~/Desktop
sudo python led_test.py
可以观察到LED1s闪一次,一共闪烁5次。
上面是直接输出高低电平的方法,下面还可以使用PWM完成LED闪烁:
#!/usr/bin/python3
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
blink = GPIO.PWM(17, 1)
try:
blink.start(50)
while True:
pass
except KeyboardInterrupt:
blink.stop()
GPIO.cleanup()
start() 方法指定了占空比(从 1 到 100)。在开始 PWM 信号后,程序就可以解放出来做其他事情了。GPIO 17 会持续发送 PWM 信号,直到停止它。 blink = GPIO.PWM(17, 1) 指定了 PWM 信号以 1HZ 的频率发送,灯 1 秒闪烁一次。按 Control + C 中止闪烁退出。
【关于查询GPIO pin脚位】
除了上面的方法,还介绍一种方法,使用WiringPi:
上面已经提过了,WiringPi是一个树莓派使用的C语言编写的BCM2835通用输入输出控制库。以GNULGPLv3许可证发行,可用于C和C++以及很多其他语言(经过适当封装),和Arduino的”wiring system1“相似。
笔者的系统貌似已经从官网下载下来已经默认安装了WiringPi,命令gpio -v可以查询版本。命令gpio readall可以查看pin脚位编号。
参考:
https://www.cnblogs.com/zhenqichai/p/raspberry-pi-control-GPIO-with-python.html
https://jingyan.baidu.com/article/ad310e800ef7371848f49e4d.html
https://blog.csdn.net/K_AAbb/article/details/114951111
https://www.cnblogs.com/wirehome/p/10412337.html
https://www.jianshu.com/p/008339095fd6
https://www.cnblogs.com/isha2088/p/6282191.html
https://blog.csdn.net/qq_40657528/article/details/86515018
https://shumeipai.nxez.com/raspberry-pi-pins-version-40
https://wiki.jikexueyuan.com/project/raspberry-pi/gpio.html
https://blog.csdn.net/qq_36958104/article/details/83447224
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。