陪你一起玩樹莓派-按鍵

在控制電路中,設備的啟停、參數的設置都離不開按鍵操作,所以按鍵的處理也是很重要的一個環節。

陪你一起玩樹莓派-按鍵

常用按鍵

一、在本節課中我們會講到兩個重要的概念

1、中斷處理

中斷就是CPU正常運行期間,由於內、外部事件引起的CPU暫時停止正在運行的程序,去執行該內部事件或外部事件的引起的服務中去,服務執行完畢後再返回斷點處繼續執行的情形。這樣的中斷機制極大的提高了CPU運行效率。

2、按鍵防抖

通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由於機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產生這種現象而作的措施就是按鍵消抖。

抖動時間的長短由按鍵的機械特性決定,一般為5ms~10ms。這是一個很重要的時間參數,在很多場合都要用到。

陪你一起玩樹莓派-按鍵

按鍵的消抖,可用硬件或軟件兩種方法:

硬件消抖

在鍵數較少時可用硬件方法消除鍵抖動。

軟件消抖

如果按鍵較多,常用軟件方法去抖,即檢測出鍵閉合後執行一個延時程序,5ms~10ms的延時,讓前沿抖動消失後再一次檢測鍵的狀態,如果仍保持閉合狀態電平,則確認為真正有鍵按下。當檢測到按鍵釋放後,也要給5ms~10ms的延時,待後沿抖動消失後才能轉入該鍵的處理程序。

二、實驗前準備

1、麵包板 x 1

2、輕觸按鍵 x 2

3、10K電阻 x 2

4、杜邦線若干

5、發光二極管 x 1

三、原理圖

陪你一起玩樹莓派-按鍵

注意:上一節我們的led的正極是接在gpio.18上,通過gpio.18 設置為高電平點亮。本節我們的led正極接在3.3v上,通過gpio.18設置低電平點亮.

按鍵說明:2個按鍵一端接在3.3v上,另一端分別接在GPIO.05和GPIO.06上,同時用兩個10K的電阻從GPIO端接到GND上(用作下拉電阻)

四、實驗目的

1、通過一個按鍵控制led亮滅

2、通過兩個按鍵控制led的亮滅

五、程序代碼

1、一個按鍵控制

#!/usr/bin/python3
# 導入樹莓派GPIO庫,為了方便操作,我們定義一個GPIO的別名
import RPi.GPIO as GPIO
import time
key_up = 6
key_down = 5
led = 18
global ledStatus
ledStatus = True
def init():
# 設置GPIO的引腳編碼方式,這裡我們選用BCM編碼方式,相應的引腳也要按BCM設置
GPIO.setmode(GPIO.BCM)
# 設置忽略警告信息
GPIO.setwarnings(False)
# 定義按鍵引腳
# 設置按鍵對應的GPIO為輸入模式並且設置為下拉模式
GPIO.setup(key_up, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(key_down, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
# 設置led引腳,設置GPIO為輸出模式
GPIO.setup(led, GPIO.OUT)
# 按鍵設置中斷,第一個參數:gpio編號,第二個:觸發方式,第三個:回調方法,第四個:軟件消抖時間
GPIO.add_event_detect(key_up, GPIO.RISING, callback=on_key_up, bouncetime=200)
GPIO.add_event_detect(key_down, GPIO.RISING, callback=on_key_down, bouncetime=200)
# 按鍵回調方法
def on_key_up(channel):
print('up')
global ledStatus
ledStatus = not ledStatus
GPIO.output(led, ledStatus)

def on_key_down(channel):
print('down')
# 初始化
init()
GPIO.output(led, GPIO.HIGH)
try:
while 1:
pass
except Exception as e:
print(e)

2、兩個按鍵控制

#!/usr/bin/python3
# 導入樹莓派GPIO庫,為了方便操作,我們定義一個GPIO的別名
import RPi.GPIO as GPIO
import time
key_up = 6
key_down = 5
led = 18
def init():
# 設置GPIO的引腳編碼方式,這裡我們選用BCM編碼方式,相應的引腳也要按BCM設置
GPIO.setmode(GPIO.BCM)
# 設置忽略警告信息
GPIO.setwarnings(False)
# 定義按鍵引腳
# 設置按鍵對應的GPIO為輸入模式並且設置為下拉模式
GPIO.setup(key_up, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(key_down, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
# 設置led引腳,設置GPIO為輸出模式
GPIO.setup(led, GPIO.OUT)
# 按鍵設置中斷,第一個參數:gpio編號,第二個:觸發方式,第三個:回調方法,第四個:軟件消抖時間
GPIO.add_event_detect(key_up, GPIO.RISING, callback=on_key_up, bouncetime=200)

GPIO.add_event_detect(key_down, GPIO.RISING, callback=on_key_down, bouncetime=200)
# 按鍵回調方法
def on_key_up(channel):
print('up')
GPIO.output(led, 0)
def on_key_down(channel):
print('down')
GPIO.output(led, 1)
init()
GPIO.output(led, GPIO.HIGH)
try:
while 1:
pass
except Exception as e:
print(e)

GPIO.RISING 的意思是上升沿觸發

boundcetime=200的意思是不檢測200毫秒內的觸發,這個就是防抖關鍵

關注我,陪你一起玩樹莓派

歡迎大家把玩樹莓派遇到的問題留言,我會一一解答。

下一節,我們一塊學習PWM


分享到:


相關文章: