python|树莓派基于python的GPIO操作(输入输出,中断,串口,PWM基本操作)
先了解一下树莓派的GPIO分布,可以通过输入gpio readall获取GPIO的分布情况。
文章图片
出现Oops - unable to determine board type... model: 17的报错可能是wiringPi版本问题,
输入下面命令升级wiringPi版本即可
cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
了解io分布后就可以开始对io编程了。
导入库:
import RPi.GPIO as GPIO
输入输出 1.设置引脚模式:
GPIO.setmode(GPIO.BMC/BOARD) #BMC或者BOARD模式
这里注意一下BMC的io编号与BOARD的io编号不同,详细见io分布
2.设置引脚为输入:
GPIO.setup(pin,GPIO.IN)GPIO.setup(pinx,GPIO.IN,pull_up_down=GPIO.PUD_UP/GPIO.DOWN)#可以调整上下拉状态
3.设置初始化输出高,低电平:
GPIO.setup(pin,GPIO.OUT,initial=GPIO.HIGH/GPIO.LOW)
当然python的好处是可以创建一个列表,然后将列表带入函数中,使其一次性执行多个针脚的输入输出,如:
PinList=[pin1,pin2,pin3]GPIO.setup(PinList,GPIO.IN)
通过创建一个列表将列表中加入引脚的定义,实现多引脚同时设定为输入。
4.读取io状态
GPIO.input(pinx) #input()方法可以读取pinx引脚的高低电平
中断 wait_for_edge(): 用于检测到边沿后执行函数
import RPi.GPIO as GPIO##引入GPIO模块
import time##引入time库
touchPin = 18GPIO.setmode(GPIO.BCM)
GPIO.setup(touchPin, GPIO.IN)
print '准备开始接收'GPIO.wait_for_edge(touchPin, GPIO.RISING)
print '发现低电压变化高电压'GPIO.wait_for_edge(touchPin, GPIO.FALLING)
print '发现高电压变化低电压
event_detect()系列函数: 对一个引脚进行监听,一旦引脚输入发生了改变,调用event_detected()函数会返回True。
函数 | 参数含义 | 函数含义 |
add_event_detect( channel, status, bouncetime=300) | 传感器引脚,要检测的状态 | 注册一个事件用于检测status是否发现 |
event_detected( channel) | 要检测的引脚 | 检测引脚是否检测到status状态 |
add_event_callback( channel, callback) | 传感器引脚,回调函数 | 发现指定status然后回调执行自定义方法 |
remove_event_detect( channel) | 要检测的引脚 | 停止边缘检测 |
注:status可选值 GPIO.RISING(电压升高), GPIO.FALLING(电压变低), GPIO.BOTH(电压升高或降低);bouncetime为抖动时间用于软件防抖,单位毫秒。
串口: 在使用前需要修改 /boot/cmdline.txt和/boot/config.txt
输入以下指令
sudo nano /boot/cmdline.txt
#将内容修改为
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2rootfstype=ext4 elevator=deadline fsck.repair=yesrootwaitsudo nano /boot/config.txt
#在最后加上
dtoverlay=pi3-miniuart-bt
enable_uart=1
安装python-serial模块
sudo apt-get install python-serial
做完这些配置后重启树莓派
下面是测试串口代码,(回显功能)
# -*- coding: utf-8 -*
import serial
import time
# 打开串口
ser = serial.Serial("/dev/ttyAMA0", 9600)
def main():
while True:
# 获得接收缓冲区字符
count = ser.inWaiting()
if count != 0:
# 读取内容并回显
recv = ser.read(count)
ser.write(recv)
# 清空接收缓冲区
ser.flushInput()
# 必要的软件延时
time.sleep(0.1)if __name__ == '__main__':
#如果本文件作为脚本运行
try:
main()
except KeyboardInterrupt:
#异常处理
if ser != None:
ser.close()
PWM:
Pwm=GPIO.PWM(pin,frequence) #创建PWM实例Pwm.start(dc) #启动PWM dc值(占空比)Pwm.ChangeFrequency(freq) #改变PWM频率Pwm.ChangeDutyCycle(dc) # 改变PWM的占空比0.0<=dc <=100.Pwm.stop() #停止PWM
LED亮暗pwm示例
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)p = GPIO.PWM(12, 50)# 通道为 12 频率为 50Hz
p.start(0)
try:
while 1:
for dc in range(0, 101, 5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
for dc in range(100, -1, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
except KeyboardInterrupt:
pass
p.stop()
GPIO.cleanup()
【python|树莓派基于python的GPIO操作(输入输出,中断,串口,PWM基本操作)】
推荐阅读
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- 丰盛派创始人安裘密语录
- Python(pathlib模块)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- Python数据分析(一)(Matplotlib使用)