使用樹莓派來做輸出一般來說都算是比較簡單,大部份沒有數位電路觀念的朋友,透過簡單的接線,直接由Raspberry Pi的GPIO連線到輸出的元件,再全部用程式來控制也說得過去。如果是點亮幾個LED還算是容易,但是如果需要連線到7段顯示器來顯示出數字的話,全部用GPIO來連接a, b, c, d, e, f, g,就要用掉7個輸出埠,算是滿浪費的,因比較折衷的方法,則是透過TTL 7447這個BCD轉7段顯示器的IC,只要用到4個輸出端,在運用上較為合理。此外,輸入的部份,如果冒然把電源導入,有燒毀樹莓派的風險,還要簡單地接一個Pull Down或Pull Up的電路,比較安全。

本文的主要內容即是是一個按鈕來做為輸入,按下按鈕之後樹莓派即會驅動7段顯示器進行倒數計時,再長按按鈕之後即立刻結束程式以停止計時的動作。示範影片如下:

以下是這個實驗所使用到的零件:

  • TTL IC: 74LS47 x 1
  • Push Button按鈕 x 1
  • 10K電阻 x 1
  • 1K 電阻 x 16
  • 7段顯示器 x 1 (共陽極)
  • LED x 4

樹莓派除了5V電源(PIN 2)和接地GND(PIN 6)之外,輸出的GPIO使用到PIN8, 10, 12, 16,當做是7447的資料輸入,而PIN 3則是用來當做是輸入,和按鈕做連接。至於那4顆LED則是用來檢視BCD的輸入值,所以也是和GPIO的4個輸出端有做連接。(詳細電路圖後補)

下圖是7447和輸入電阻的照片:

2016-06-29 18.27.15

下圖則是7段顯示器和BCD資料輸入端的LED指示燈的合照:

2016-06-29 18.27.22

下圖則是按鈕和Pull Down電路:

2016-06-29 18.27.29

Python的程式如下:

import RPi.GPIO as gpio
import time

gpio.setmode(gpio.BOARD)
gpio.setwarnings(False)
gpio.setup(3, gpio.IN, pull_up_down=gpio.PUD_DOWN)
gpio.setup(12, gpio.OUT)
gpio.setup(16, gpio.OUT)
gpio.setup(18, gpio.OUT)
gpio.setup(22, gpio.OUT)

def setIO(x):
    gpio.output(12, x[3] & True)
    gpio.output(16, x[2] & True)
    gpio.output(18, x[1] & True)
    gpio.output(22, x[0] & True)

def setNum(n):
    if n > 9:
        return
    if n == 0:
        x = [0, 0, 0, 0]
        setIO(x)
        return
    x = list()
    bin_length = 6-len(bin(n))
    for i in range(bin_length):
        x.append(0)
    while n > 0:
        x.insert(bin_length,n % 2)
        n = n / 2
    setIO(x)

print 'Push the button to start...'
while gpio.input(3):
    pass
print 'Start to count down...'
for c in range(50):
    for i in range(10):
        setNum(9-i)
        time.sleep(1)
        if not gpio.input(3):
            print 'stop'
            exit()
    
gpio.cleanup()

和之前最不一樣的地方在於設定輸入埠時要指定使用的是Pull Up電路還是Pull Down電路,否則會偵測不出來。

(829)

%d 位部落客按了讚: