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

      

  • 相关阅读:
    python3 numpy基本用法归纳总结
    MySQL 中的三中循环 while loop repeat 的基本用法
    什么是网关及网关作用
    网络扫描工具nmap
    nmap基本使用方法
    nmap脚本使用总结
    用Delphi将数据导入到Excel并控制Excel
    delphi Form属性设置 设置可实现窗体无最大化,并且不能拖大拖小(写一个WM_EXITSIZEMOVE的空函数)
    Delphi 数据类型列表
    一个队列类的实现(比delphi自带的速度快70倍)(线程安全版本)
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/12199058.html
Copyright © 2011-2022 走看看