zoukankan      html  css  js  c++  java
  • 53树莓派操作引脚口

     

    https://www.jianshu.com/p/f31b90cc756f

     1倒入引用

     importRPi.GPIOasGPIO
    

     

    2针脚编号 不同的命名规则

    你可以使用下列代码(强制的)指定一种编号规则:
      GPIO.setmode(GPIO.BOARD)
    
      #or
    
      GPIO.setmode(GPIO.BCM)
    
      下面代码将返回被设置的编号规则
    
      mode=GPIO.getmode()
    

      

    3警告

      如果RPi.GRIO检测到一个引脚已经被设置成了非默认值,那么你将看到一个警告信息。你可以通过下列代码禁用警告:

    GPIO.setwarnings(False)

    引脚设置

    在使用一个引脚前,你需要设置这些引脚作为输入还是输出。配置一个引脚的代码如下:

    #将引脚设置为输入模式
    GPIO.setup(channel,GPIO.IN)
    #将引脚设置为输出模式
    GPIO.setup(channel,GPIO.OUT)
    #为输出的引脚设置默认值
    GPIO.setup(channel,GPIO.OUT,initial=GPIO.HIGH)

    4释放

    一般来说,程序到达最后都需要释放资源,这个好习惯可以避免偶然损坏树莓派。释放脚本中的使用的引脚:

    GPIO.cleanup()

    注意,GPIO.cleanup()只会释放掉脚本中使用的GPIO引脚,并会清除设置的引脚编号规则。

     端口设置为输出的状态:

    要想点亮一个LED灯,或者驱动某个设备,都需要给电流和电压他们,这个步骤也很简单,设置引脚的输出状态就可以了,代码如下:

    GPIO.output(channel,state)

    状态可以设置为0/GPIO.LOW/False/1/GPIO.HIGH/True。如果编码规则为,GPIO.BOARD,那么channel就是对应引脚的数字。

    如果想一次性设置多个引脚,可使用下面的代码:

    chan_list=[11,12]
    GPIO.output(chan_list,GPIO.LOW)
    GPIO.output(chan_list,(GPIO.HIGH,GPIO.LOW))
    

    你还可以使用Input()函数读取一个输出引脚的状态并将其作为输出值,例如:

    GPIO.output(12,notGPIO.input(12))
    

    5读取

    我们也常常需要读取引脚的输入状态,获取引脚输入状态如下代码:

    GPIO.input(channel)
    

    低电平返回0/GPIO.LOW/False,高电平返回1/GPIO.HIGH/True。

    如果输入引脚处于悬空状态,引脚的值将是漂动的。换句话说,读取到的值是未知的,因为它并没有被连接到任何的信号上,直到按下一个按钮或开关。由于干扰的影响,输入的值可能会反复的变化。使用如下代码可以解决问题:

    上升和下降沿

    GPIO.setup(channel,GPIO.IN,pull_up_down=GPIO.PUD_UP)
    #or
    GPIO.setup(channel,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
    

    需要注意的是,上面的读取代码只是获取当前一瞬间的引脚输入信号。

    如果需要实时监控引脚的状态变化,可以有两种办法。最简单原始的方式是每隔一段时间检查输入的信号值,这种方式被称为轮询。如果你的程序读取的时机错误,则很可能会丢失输入信号。轮询是在循环中执行的,这种方式比较占用处理器资源。

    轮询方式
    
    whileGPIO.input(channel)==GPIO.LOW:
    
    time.sleep(0.01)#wait10ms to give CPU chance to do ther things  

    中断模式

    另一种响应GPIO输入的方式是使用中断(边缘检测),这里的边缘是指信号从高到低的变换(下降沿)或从低到高的变换(上升沿)。

    边缘检测

    边缘是指信号状态的改变,从低到高(上升沿)或从高到低(下降沿)。通常情况下,我们更关心于输入状态的该边而不是输入信号的值。这种状态的该边被称为事件。先介绍两个函数:

    阻塞式 wait_for_edge()函数。

    wait_for_edge()被用于阻止程序的继续执行,直到检测到一个边沿。也就是说,上文中等待按钮按下的实例可以改写为:

    channel=GPIO.wait_for_edge(channel,GPIO_RISING,timeout=5000)
    if channel is None:
        print(‘Timeoutoccurred’)
    else:
      print(‘Edgedetectedonchannel’,channel)
    

     回调函数 add_event_detect()函数

    注意:回调触发时,并不会同时执行回调函数,而是根据设置的顺序调用它们。

    函数该函数对一个引脚进行监听,一旦引脚输入状态发生了改变,调用event_detected()函数会返回true,如下代码:

    def my_callback(channel):
        print('This is a edge event callback function!')
        print('Edge detected on channel %s'%channel)
        print('This is run in a different thread to your main program')
    
    GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)

    多个回调函数

    def my_callback_one(channel):
        print('Callback one')
    
    def my_callback_two(channel):
        print('Callback two')
    
    GPIO.add_event_detect(channel, GPIO.RISING)
    GPIO.add_event_callback(channel, my_callback_one)
    GPIO.add_event_callback(channel, my_callback_two)
    

    注意:回调触发时,并不会同时执行回调函数,而是根据设置的顺序调用它们。  

    点亮一个led

    import RPi.GPIO as GPIO  //引入函数库
    import time
    
    RPi.GPIO.setmode(GPIO.BOARD)  //设置引脚编号规则
    RPi.GPIO.setup(11, RPi.GPIO.OUT)    //将11号引脚设置成输出模式
    
    while True
        GPIO.output(channel, 1)   //将引脚的状态设置为高电平,此时LED亮了
        time.sleep(1)   //程序休眠1秒钟,让LED亮1秒
        GPIO.output(channel, 0)   //将引脚状态设置为低电平,此时LED灭了
        time.sleep(1)   //程序休眠1秒钟,让LED灭1秒
    
    GPIO.cleanup()    //程序的最后别忘记清除所有资源
    

      

    使用PWM

    这个python函数库还支持PWM模式的输出,我们可以利用PWM来制作呼吸灯效果。详情看代码:

    import time
    import RPi.GPIO as GPIO   //引入库
    GPIO.setmode(GPIO.BOARD)  //设置编号方式
    GPIO.setup(12, GPIO.OUT)  //设置12号引脚为输出模式
    
    p = GPIO.PWM(12, 50)  //将12号引脚初始化为PWM实例 ,频率为50Hz
    p.start(0)    //开始脉宽调制,参数范围为: (0.0 <= dc <= 100.0)
    try:
        while 1:
            for dc in range(0, 101, 5):
                p.ChangeDutyCycle(dc)   //修改占空比 参数范围为: (0.0 <= dc <= 100.0)
                time.sleep(0.1)
            for dc in range(100, -1, -5):
                p.ChangeDutyCycle(dc)
                time.sleep(0.1)
    except KeyboardInterrupt:
        pass
    p.stop()    //停止输出PWM波
    GPIO.cleanup()    //清除
    

      

    3 综合演示

    import time
    import RPi.GPIO as GPIO
     
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
     
     
    # 普通引脚输出 
    # 6 13 19 26 4 22 
    pinA1=6
    pinA2=1
     
    GPIO.setup(pinA1, GPIO.OUT) #设置脚为输出模式
    GPIO.setup(pinA2, GPIO.OUT) #设置脚为输出模式
    
    
    # 触摸按键 输入 回调函数触发
    
    GPIO.setup(22,GPIO.IN,pull_up_down=GPIO.PUD_UP)
    
    def my_callback(channel):
        print('触发回调函数')
     #FALLING 下降沿
    GPIO.add_event_detect(22, GPIO.RISING, callback=my_callback)
    
    
    # 测试普通输出引脚
    a = 10  #闪烁10次
     
    while a > 0:
         
        a -= 1
         
        print ("HIGH")
        GPIO.output(pinA1, GPIO.HIGH)  #亮
        GPIO.output(pinA2, GPIO.HIGH)  #亮
        time.sleep( 0.2 )   #延时 秒
      
        print ("LOW")
        GPIO.output(pinA1, GPIO.LOW)   #暗
        GPIO.output(pinA2, GPIO.LOW)   #暗
        time.sleep( 0.2 )  #延时 秒
    

      

    FALLING 

    import RPi.GPIO as GPIO
    
    
    from gpiozero import Buzzer
    
    def init():
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)   
        GPIO.setup(17,GPIO.OUT)
        #GPIO.output(17,GPIO.HIGH)
        #time.sleep(3)
        pass
     
    def beep():
        #beep(on_time=1,off_time=1,n=None,background=Ture) 
        bz=Buzzer(17)   
        bz.beep(0.5,0.5,1,False)
        print(1)
        #GPIO.output(25,GPIO.HIGH)
        #time.sleep(3)
        #GPIO.output(25,GPIO.LOW)
        
    
    init()
    beep()
    
    #GPIO.cleanup()
    

      

  • 相关阅读:
    171. Excel Sheet Column Number (Easy)
    349. Intersection of Two Arrays (Easy)
    453. Minimum Moves to Equal Array Elements (Easy)
    657. Judge Route Circle (Easy)
    CSS笔记
    保存页面状态
    UI开发总结
    ubuntu 下配置munin
    反向代理配置
    JavaScript 高级程序设计第二版
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/12199058.html
Copyright © 2011-2022 走看看