Python可以這樣玩(16):共陰/共陽七段顯示器


七段顯示器是內建八個LED的顯示元件,為了方便解說,內部LED分別標上a~gdp(點p)代號。連接電源方式不同,區分共陽()極。




首先教大家如何背起來每個接腳以及顯示面板上面的發光二極體的對應關係,發光二極體的順序請先畫一個 “0”,由 “0” 這個數字順時鐘畫一圈,a – f 的位置就沒有問題了,g 代表中間橫槓,dp 代表小數點。

PIN腳共有十個,中間上下兩個都是COM,左上右下先忽略,也是從12COM 開始順時鐘畫一圈,分別就是 a – f,剩下的左上就是 g,右下就是 dp

下面則是共陽與共陰的示意圖:





自己用順時鐘原則測試一下,下面展示了呈現某個數字所需點亮的LED代號:




以共陽為例,如果我們希望顯示數字0,由於陽極連接 5V,我們就必須讓 a = b = c = d = e = f = LOW,也就是0伏特的電壓,而 g = p = HIGH,也就是5伏特的電壓,那麼沒有電位差的 g, p 就不會亮燈,自然就顯示數字0 了。而共陰則是完全相反。

我手上有兩個七段顯示器,但是我實在弄不清楚哪個是共陽哪個是共陰,這種情況,我可以用 Python 簡單的測試一下,首先假設是共陽,我把COM接到PIN 2,然後把七段顯示器的 a 腳地,打開 Python IDE,輸入以下指令:

>>> import pyfirmata
>>> board = pyfirmata.Arduino('COM3')
>>> board.digital[2].write(1)
>>> 

如果最上面那條LED亮了,就代表是共陽,反之,我們將共陰顯示器的COM 接地,然後把顯示器腳 b 接到Arduino PIN 7,接著輸入下面的指令:
>>> board.digital[7].write(1)
>>> 

這樣右上方的LED就會亮起,如下圖,右邊為共陽(BHLA7417),左邊為共陰(AHLA7215)





接下來我們就一共陽為例子,把完整的線路接起來,請參考下圖:





這張圖是我在網路上擷取下來的,是由趙英傑先生所著的 "超圖解 Arduino 互動設計" 一書中節錄下來的,誠心推薦此書,是初學者入門必讀的好書。

由於接下來的例子我們會在 Python 上面玩,PIN 1PIN 2不能使用,再加上我們是以共陽為例子,COM腳也要改變,建議你可以自行改接,以證明真的有懂,然後再對照下面的說明:

COM要接到麵包板下面的 +
麵包板下面的 + 處要接到 5V
PIN 2 接到a
PIN 3 接到b
PIN 4 接到c
PIN 5 接到d
PIN 6 接到e
PIN 7 接到f (請注意f 腳的位置)
PIN 8 接到g (g 腳在左上角)
PIN 9 接到p (p 腳在右下角,為了證明我用的是共陽八段顯示器)

全部接好之後,就會亮起 “8.”,如果你也是如此,就代表接對了。測試儀下,如果我想把燈號改成 “0”,那我就必須把 gp兩個腳設定成高電位,程式碼如下(重新 Restart Python IDE,從 import 開始)

=========================== RESTART: Shell ===========================
>>> import pyfirmata
>>> board = pyfirmata.Arduino('COM3')
>>> board.digital[8].write(1)
>>> board.digital[9].write(1)
>>> 

由這個測試我們得到一個結論,共陽由於COM腳接到5V ( 3V3),而類比PINDefault 值是0,因此在RESET的初始狀態下,燈號是全亮的,接下來我們就設計幾個場景,用 Python 來達成。

開機畫面

開機時燈號全亮,讓燈號全滅,然後順時鐘畫圈三圈,然後讓全部燈號明滅三次。請新增一個 Python 程式,存檔為 StartUp.py,我們一步一步來。

首先控制滅燈:

from pyfirmata import Arduino
from time import sleep

port = 'COM3'
board = Arduino(port)

def off_light(x):
    board.digital[x].write(1)

def off_all():
    for i in range(2,10): //PIN 2 PIN 9 都關閉
        off_light(i)

off_all()
接下來要繞圈,繞圈的腳碼為 a, b, c, d, e, f,對應的PIN腳是 2, 3, 4, 5, 6, 7,程式接著往下寫:

def on_light(x):
    board.digital[x].write(0)

def on_all():
    for i in range(2,10):
        on_light(i)

circle = [2, 3, 4, 5, 6, 7]
for x in range(3):
    for i in circle:
        on_light(i)
        sleep(0.2)
        off_all()

為了連續性,我先把 on_all() 寫出來了,最後閃三次,接在此程式碼後面:

for x in range(3):
    on_all()
    sleep(0.2)
    off_all()
    sleep(0.2)

定義數字

請不要死背,我們用推理的方式找出顯示 0 9 所對應的值:

abcdefg
0 = 0000001
1 = 1001111
2 = 0010010
3 = 0000110
4 = 1001100
5 = 0100100
6 = 0100000
7 = 0001111
8 = 0000000
9 = 0000100

完整程式如下(紅色為新增部分)

from pyfirmata import Arduino
from time import sleep

port = 'COM3'
board = Arduino(port)

def off_light(x):
    board.digital[x].write(1)

def off_all():
    for i in range(2,10):
        off_light(i)

off_all()

def on_light(x):
    board.digital[x].write(0)

def on_all():
    for i in range(2,10):
        on_light(i)

circle = [2, 3, 4, 5, 6, 7]
for x in range(3):
    for i in circle:
        on_light(i)
        sleep(0.2)
        off_all()

for x in range(3):
    on_all()
    sleep(0.2)
    off_all()
    sleep(0.2)

n0 = [0,0,0,0,0,0,1]
n1 = [1,0,0,1,1,1,1]
n2 = [0,0,1,0,0,1,0]
n3 = [0,0,0,0,1,1,0]
n4 = [1,0,0,1,1,0,0]
n5 = [0,1,0,0,1,0,0]
n6 = [0,1,0,0,0,0,0]
n7 = [0,0,0,1,1,1,1]
n8 = [0,0,0,0,0,0,0]
n9 = [0,0,0,0,1,0,0]
all_num = [n0, n1, n2, n3, n4, n5, n6, n7, n8, n9]

def on_number(x):
    for i in range(7):
        board.digital[i+2].write(x[i])

for i in all_num:
    on_number(i)
    sleep(1)
    off_all()

定義部分英文字母

回想過去的 BB Call時代,常常會利用來傳遞英文訊息,因為BB Call 除了數字之外,還可以傳遞一些簡單的英文字母例如:EU等等。當然我們也可以自己定義部分的英文字母,就用同樣的方法,定義A - F 這六個英文字母,這樣就可以用來表示16進位的數字。

先整理出代碼表(上方的英文字母代表顯示器的腳位)
abcdefg
A = 0001000
b = 1100000
C = 0110001
d = 1000010
E = 0110000
F = 0111000

然後加入 Python 程式,直接使用上一小節的程式碼:

na = [0,0,0,1,0,0,0]
nb = [1,1,0,0,0,0,0]
nc = [0,1,1,0,0,0,1]
nd = [1,0,0,0,0,1,0]
ne = [0,1,1,0,0,0,0]
nf = [0,1,1,1,0,0,0]
all_ltr = [na, nb, nc, nd, ne, nf]

for i in all_ltr:
    on_number(i)
    sleep(0.5)
    off_all()

是不是很容易呢?如果今天是用的是共陰的顯示器呢?很簡單,把列表裡面的01對調就好。

然而七段顯示器電路有兩個缺點: (1)有可能使用到數位 0 1 腳、(2)佔用太多腳位。為了減少佔用腳位,可改採積體電路(Integrated Circuit)元件來擴充 Arduino 的輸出腳位。

留言

這個網誌中的熱門文章

Python可以這樣玩(11):數學繪圖

Python可以這樣玩(15):蜂鳴器與音樂