【填坑】树莓派GPIO接口命名规则 A different mode has already been set解决方案

本文讲述了如何在Python GPIO操作中避免setmode函数的BCM和BOARD模式冲突,建议统一使用一种模式并相应调整IO口编号。提供左右超声波传感器距离测量示例,展示了如何在代码中切换GPIO模式并处理距离计算。
摘要由CSDN通过智能技术生成

主要解决以下两种设置冲突。

GPIO.setmode(GPIO.BCM)

GPIO.setmode(GPIO.BOARD)

只要把命名规则统一起来就好了。都换成BCM或者BOARD,但是要记得把接口的数值换了,因为BCM跟BOARD是不一样的。

 

 例如GPIO.setmode(GPIO.BCM)

定义函数实现左右两个超声波感知距离。

# -*- coding:UTF-8 -*-
import RPi.GPIO as GPIO
import time
def get_distance_lr():
    GPIO.setmode(GPIO.BCM)

    trig0=22     #发射IO口接在25号
    echo0=24    #接收IO口接在24号

    GPIO.setup(trig0,GPIO.OUT,initial=GPIO.LOW)
    GPIO.setup(echo0,GPIO.IN)

    trig1=7     #发射IO口接在25号
    echo1=8    #接收IO口接在24号

    GPIO.setup(trig1,GPIO.OUT,initial=GPIO.LOW)
    GPIO.setup(echo1,GPIO.IN)


    while True:
        #send
        GPIO.output(trig0,True)
        GPIO.output(trig1,True)
        time.sleep(0.00011)   #发送1us的信号 
        GPIO.output(trig0,False)
        GPIO.output(trig1,False)

        #start recording
        while GPIO.input(echo0)==0:
            pass
        start0=time.time()
        
        #start recording
        while GPIO.input(echo1)==0:
            pass
        start1=time.time()
            
        #end recording
        while GPIO.input(echo0)==1:
            pass
        end0=time.time()
        
        #end recording
        while GPIO.input(echo1)==1:
            pass
        end1=time.time()
     
        #compute distance  根据时间,计算出光的传播速度/2即为距离
        distance_l=round((end0-start0)*343/2*100,2)
        distance_r=round((end1-start1)*343/2*100,2)
        
        #print("distance_l:{0}cm".format(distance_l))
        #time.sleep(0.1)
        #print("distance_r:{0}cm".format(distance_r))
        #print("-----------------------------------")
        #time.sleep(2)
        return distance_l, distance_r
    

GPIO.setmode(GPIO.BOARD)

# -*- coding:UTF-8 -*-
import RPi.GPIO as GPIO
import time
def get_distance_lr():
    GPIO.setmode(GPIO.BOARD)

    trig0=15     #发射IO口接在22号
    echo0=18    #接收IO口接在24号

    GPIO.setup(trig0,GPIO.OUT,initial=GPIO.LOW)
    GPIO.setup(echo0,GPIO.IN)

    trig1=26     #发射IO口接在7号
    echo1=24    #接收IO口接在8号

    GPIO.setup(trig1,GPIO.OUT,initial=GPIO.LOW)
    GPIO.setup(echo1,GPIO.IN)


    while True:
        #send
        GPIO.output(trig0,True)
        GPIO.output(trig1,True)
        time.sleep(0.00011)   #发送1us的信号 
        GPIO.output(trig0,False)
        GPIO.output(trig1,False)

        #start recording
        while GPIO.input(echo0)==0:
            pass
        start0=time.time()
        
        #start recording
        while GPIO.input(echo1)==0:
            pass
        start1=time.time()
            
        #end recording
        while GPIO.input(echo0)==1:
            pass
        end0=time.time()
        
        #end recording
        while GPIO.input(echo1)==1:
            pass
        end1=time.time()
     
        #compute distance  根据时间,计算出光的传播速度/2即为距离
        distance_l=round((end0-start0)*343/2*100,2)
        distance_r=round((end1-start1)*343/2*100,2)
        if distance_l > 5000:
            distance_l = 5000
        if distance_r > 5000:
            distance_r = 5000
        
        # print("distance_q:{0}cm".format(distance_q/10))
        # time.sleep(0.1)
        #print("distance_l:{0}cm".format(distance_l))
        #time.sleep(0.1)
        #print("distance_r:{0}cm".format(distance_r))
        #print("-----------------------------------")
        #time.sleep(2)
        return distance_l, distance_r
    

调用他的代码,输出得到的传感器检测距离。

注:以下代码有我的部分其他工程,此处仅仅是举个例子。

# -*- coding:UTF-8 -*-
import HiwonderSDK.Sonar
import RPi.GPIO as GPIO
import time
from sonar_get_distance_2board import get_distance_lr
#from sonar_get_distance_2 import get_distance_lr

sonar = HiwonderSDK.Sonar.Sonar()


    
while True:
    dis_mm = sonar.getDistance()
    distance_l, distance_r = get_distance_lr()
    print("distance_q:{0}cm".format(dis_mm/10.0))
    print("distance_l:{0}cm".format(distance_l))
    print("distance_r:{0}cm".format(distance_r))
    print("---------------")
    time.sleep(1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Clark-dj

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

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

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

打赏作者

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

抵扣说明:

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

余额充值