树莓派基于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.BCM/BOARD) #BCM或者BOARD模式

这里注意一下BCM的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 = 18

GPIO.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/mmcblk0p2  rootfstype=ext4 elevator=deadline fsck.repair=yes  rootwait

sudo 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()


 

  • 17
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
要通过手机操作ESP32的GPIO并调节PWM输出,可以使用Micropython和Websocket技术。以下是基本的步骤: 1. 首先,需要在ESP32上安装Micropython,并在电脑上安装一个串口终端程序,如Putty或Tera Term。 2. 在ESP32上编写一个Micropython代码,用于初始化GPIO并创建WebSocket服务器。以下是一个示例代码: ```python import machine import network import ujson import websocket # 定义GPIO引脚号和PWM频率 LED_PIN = 2 PWM_FREQ = 5000 # 初始化WiFi连接 sta_if = network.WLAN(network.STA_IF) sta_if.active(True) sta_if.connect('your_wifi_ssid', 'your_wifi_password') while not sta_if.isconnected(): pass # 初始化LED引脚和PWM输出 led = machine.Pin(LED_PIN, machine.Pin.OUT) pwm = machine.PWM(led, freq=PWM_FREQ) pwm.duty(0) # 创建WebSocket服务器 ws = websocket.WebSocket() def on_message(ws, message): # 解析收到的JSON数据 data = ujson.loads(message) # 根据JSON数据设置PWM输出 if 'pwm' in data: duty = int(data['pwm'] * 1023) pwm.duty(duty) # 连接WebSocket客户端 ws.connect('ws://your_esp32_ip:your_port') # 绑定WebSocket消息处理函数 ws.on_message = on_message ``` 3. 在手机应用程序中,创建一个WebSocket客户端并发送JSON格式的数据包以控制GPIOPWM输出。以下是一个示例代码: ```python import websocket import ujson # 创建WebSocket客户端 ws = websocket.WebSocket() def on_open(): # 连接ESP32的WebSocket服务器 ws.connect('ws://your_esp32_ip:your_port') def on_message(ws, message): # 处理收到的消息 print(message) # 绑定WebSocket事件处理函数 ws.on_open = on_open ws.on_message = on_message # 发送控制命令 data = {'gpio': {'pin': 2, 'value': 1}, 'pwm': 0.5} message = ujson.dumps(data) ws.send(message) ``` 在上面的示例代码中,我们使用了一个JSON数据包来控制GPIOPWM输出。如果数据包中包含“gpio”键,则表明需要设置GPIO的状态。键“pin”表示GPIO引脚号,键“value”表示GPIO的状态(0或1)。如果数据包中包含“pwm”键,则表明需要设置PWM输出。键“pwm”表示PWM输出占空比(0到1之间的浮点数)。 这样,我们就可以通过手机应用程序对ESP32的GPIO进行控制并调节PWM输出了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉山有客不自赏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值