肆、電路設計與分析


  下面的圖43-1是此次使用Arduino Uno板和型號為RC522的RFID讀寫器之RFID門禁管制系統完整電路圖,為了和前一篇同樣使用Arduino Uno板,但使用YHY502CTG或是CY14443C這兩款RFID讀寫器的系統作個比較,筆者特地把之前製作系統的電路圖附在後面(如圖43-2所示);除了使用RFID讀寫器不同之外,基本上兩者差異不大。不過其中最主要的不同點,就是在4X4鍵盤電路部份多了幾顆電阻,這部份也是本次製作最重要的改進之處,讀者們可以比較一下兩者4X4鍵盤電路部份之間的差異,前者也就是本次製作的電路中,這個4X4鍵盤電路並沒有所謂的掃瞄輸出腳,剩下的只有一根類比輸入腳A0而已;後者除了這根類比輸入腳A0,還有作為掃瞄輸出的四根數位輸出腳(D15~D18),這個部份的動作原理在後面會有詳細的說明。

圖43-1.使用RC522的RFID讀寫器之門禁管制系統電路圖


圖43-2.使用YHY502CTG(CY14443C)之門禁管制系統電路圖

圖43-3.Arduino Uno板外觀符號比對電路圖


在前一篇的文章中我們已經討論過當所使用的單晶片微電腦由8051改成Arduino Uno板時會面臨的問題,就是這片模組板的I/O接腳不夠用,不過在筆者將鍵盤掃瞄電路所使用到的接腳由8根改進成5根後,就可以解決這個I/O Pin腳不足的問題!因此最後筆者當然還是選用了最小片的Arduino Uno板,而不是其它比較大如Mega 2560等的模組板。

在我們第一次使用89S51的系統中,連接到它的元件及使用到的接腳總共有:

1.LCD顯示器:D7~D0及EN、R/W、RS與背光共12隻接腳

2.4X4鍵盤:4隻掃瞄輸出與4隻掃瞄輸入共8隻接腳

3.RFID:TX、RX及SIG共3隻接腳

4.24C02:SDA與SCL共2隻接腳

5.蜂鳴器、電鎖輸出及初始設定輸入:共3隻接腳


也就是說總共會使用到28隻I/O接腳,這對89S51這顆單晶片微電腦(總共有32根I/O接腳)來說是綽綽有餘,所以不用擔心I/OPin腳不夠用的問題。

然而以標準的Arduino Uno板來說一共只有14隻數位接腳(D0~D13)與6隻類比接腳(A0~A5),亦即加一加總共只有20隻I/OPin接腳可以使用;而且其中的D0(RX0)和D1(TX0)還同時作為程式燒錄與偵錯的串列傳輸介面之用,一般來說除非很有把握,不然基本上都會建議保留不要拿來作其他用途,否則在開發階段當遇到問題時可能會很難處理。其實那6隻類比接腳(A0~A5)是可以作為數位接腳使用,按照Arduino官方內部所提供的資料,這6隻類比接腳數位腳如果拿來當作數位接腳用的話,其編號是D14~D19,也就是說林林總總加起來扣去D0(RX0)和D1(TX0)這兩2隻接腳後,可用的I/OPin腳共有18根。如果以前面的計算結果(共使用到28隻I/OPin腳)來看,由於Arduino Uno板上的ATmega 328單晶片內部已經見有1K的S-EEPROM,所以可以扣掉原來使用在24C02的SDA與SCL這2隻接腳,這樣一來直接使用標準的Arduino Uno板的話就只差8隻I/OPin腳(即28-18-2=8)。

很幸運的一般我們所使用的文字型的LCD顯示器都具有所謂的4位元的資料匯流排介面模式可以使用,而且Arduino開發整合軟體的程式庫中也提供了4位元資料匯流排介面的指令,再加上Arduino的LCD顯示器內建程式庫指令中有很多可以不用R/W這根接腳,因此我們就可以省下5隻接腳(即使用於LCD顯示器的D0~D3和R/W),如此一來離目標只差3隻接腳了。在前一篇的製作中筆者上窮碧落下黃泉的搜尋與研究之後,終於設計出一個可以只用5隻接腳就可完成的4X4鍵盤掃瞄電路,也就是說那最後不足的3隻接腳就有著落了!這麼一來我們的系統就可以使用Arduino家族中最小一塊的Uno模組板作為我們此次製作的系統晶片板了。

然而當我們所使用的RFID讀寫器從YHY502CTG或是CY14443C這兩款改成RC522時新的問題又出現了!這次仍然是/O Pin腳不足,因為RC522這個模組使用的是所謂的SPI介面,在我們所使用的RC522函式庫中,作者提供了這個模組在不同Arduino模組板中所使用的I/O Pin腳(如表一)資料,可是不管是那一種模組板都必須使用到5隻I/OPin腳,而原來使用的YHY502CTG或是CY14443C這兩種則使用了3根接腳(即TX、RX與SIG),也就是說我們又不夠兩隻接腳!

* Typical pin layout used:

 * ------------------------------------------------------------

 *           MFRC522    Arduino    Arduino   Arduino

 *           Reader/PCD   Uno        Mega      Nano v3

 * Signal      Pin          Pin          Pin        Pin

 * ------------------------------------------------------------

 * RST/Reset   RST          9           5         D9

 * SPI SS      SDA(SS)      10          53        D10

 * SPI MOSI   MOSI        11 / ICSP-4   51        D11

 * SPI MISO   MISO        12 / ICSP-1   50        D12

 * SPI SCK    SCK         13 / ICSP-3   52        D13

 */

表一、RC522在不同Arduino模組板中所使用的I/O Pin腳


在我們的系統中如果想要在不增加額外零件的條件下去減少I/O Pin腳的使用,最可能的方法就是再從4X4鍵盤掃瞄電路上下手,其實很久之前就有人提出只要透過電阻矩陣分壓的方式,便可以只使用一根類比輸入接腳完成4X4鍵盤掃瞄電路,只是筆者看到的是理論性的示意電路圖,其中的電阻並沒有標示實際電阻值;由於筆者之前曾嘗試測試過幾種不同的電組阻值組合,可是都宣告失敗,所以才會有上一次那種折衷式使用5隻Pin腳的4X4鍵盤掃瞄電路。

俗語說「狗急跳牆,人急懸樑」,這一次的製作雖然說沒慘到那種程度,不過以筆者不服輸的脾氣就是不想輕言放棄,所以在幾次的重新設計與測試之下,終於讓筆者找出一個新的電路出來,實現了這種只使用一根類比輸入接腳的4X4鍵盤掃瞄電路,而所需付出的額外代價只是多3個電阻而已,這樣的成本效益不可謂不大吧!而且這麼一來我們的系統還多出了2根沒有用到的接腳,可以留作以後功能擴充之用。詳細的電路工作原理就留到後面4X4鍵盤掃瞄電路設計部份再為各位讀者作說明,

接著就讓筆者依序說明我們這次製作的系統電路內容與工作原理。


四.1 Arduino Uno板主體電路

在筆者之前一系列的專題製作中所有的電路圖都是使用Protel這個軟體來繪製,可是在遇到Arduino這個族系的模組板時,大部份人都會使用Fritzing,主要的原因是這個電路繪圖軟體是開放式的免費綠色軟體,而且圖面清楚又美觀,更具有立體感,再加上對Arduino系列所有的模組板具有完整的支援,所以坊間有提到Arduino系列模組板的文章大都使用這個軟體來繪製系統電路;此外連教育部的”校園自由軟體數位資源推廣中心”網站中也建議及提供這個軟體的網址讓人可連接下載,由此可見這應該是個不錯的軟體,因此建議有興趣的讀者不妨到它的官方網站(網址為”http://fritzing.org”)去下載來試試看。

不過理想和實際總是有些差距,Fritzing這個軟體雖然很不錯,可是當筆者在繪製本次製作的電路時卻發現,它並沒有現成的4X4鍵盤這個零組件可以用,當然我們可以用16個單獨的按鈕來完成,可是在連接線路時就有些麻煩與複雜,當然我們是可以自己新建一個4X4鍵盤這個零組件,不過由於筆者對於Fritzing這個軟體還不太熟稔,所以最後還是決定用之前的Protel這個軟體來繪製本次製作的電路圖。

為了呈現原汁原味的Arduino系統,所以筆者也把前一次製作的圖43-2電路中作為UNO模組板代表的ATMega328晶片改回原來的UNO模組板外觀圖,為了讓讀者們能比對原始UNO模組板與筆者所製作的零件符號外觀的異同,筆者特地將兩者並列在圖43-3中,這樣大家應該就可以比較容易的看出其中的接腳名稱與位置;為了方便接線,所以一些接腳的位置也略有更動,如果曾看過前一篇製作的讀者,還請注意一下其中的差異!

從圖44的Uno板外觀圖中我們可以看到,位在模組板上方的是編號為D0~D13的數位(Digital)輸出/入腳,其中的D0、D1還具有RX0、TX0也就是與電腦連接的串列傳輸(UART)功能;而右下方則是A0~A5六隻類比輸入(Analog In)接腳,這六隻接腳也可作為D14~D19數位(Digital)輸出/入腳之用。其中編號為D13的數位(Digital)輸出/入腳在板子上有內建並接一顆LED燈,正好位在D13腳下方標有’L’這個字元的右方,因此一般來說除非必要這隻接腳最好當成輸出腳用,以免外界的輸入驅動能力不足。此外D0、D1與這兩隻作為與電腦作串列傳輸連接的腳也各並接了一顆LED燈(位在上一顆LED燈的下方),並分別標上TX(D1)與RX(D0)的文字,如果使用不慎就可能造成程式下載燒錄時的異常,所以除非很有把握,否則是不建議隨便拿來使用。

圖44.Arduino Uno模組板外觀圖


圖45是Arduino Uno模組板在Fritzing軟體中的概要電路圖,要注意它並非顯示ATMega328單晶片微電腦的外觀接腳,所以也看不到振盪晶體(頻率為16MHz)與重置(Reset)電路,這是因為它們已經內建在Uno模組板了,讀者們可不要誤會ATMega328單晶片微電腦可以不使用這些電路;而且上方的5V與3V3是對外輸出的電壓接腳,可供一些小電流的零組件使用,其電源電壓的來源有二,一是從電腦USB接座所提供(在圖45中是看不到,一般來說受限於電腦的USB插座的規範,它的總負載電流不能超過500mA),一是從上方標示為VIN的接腳輸入,此電壓輸入接腳官方建議的電壓輸入範圍為7~12Vdc。如果比對兩張圖可看出,圖45的電路概要圖接腳其實就是圖44的外觀圖中上下兩排的牛角排針母座的部份,而我們在使用與設計程式時,也只需要注意及了解這兩排接腳的意義與功能即可。

  


圖45.Arduino Uno模組板概要圖


  在Arduino一系列的模組板中幾乎都使用16MHz的石英晶體當作單晶片的時脈信號來源,由於Arduino的開發語言是類似C的高階語言,在它的內建程式庫中已經把一些跟硬體時間有關的部份建構得很完整,因此使用者只要在開發階段選對模組板的型號就可以,不必去考慮實際硬體的詳細規格與內容,如此一來對許多開發者來說可是一大福音,而這也就是為何很多非電子、電機科班出身的人喜歡使用Arduino設計他們的產品的原因之一。


四.2 4X4鍵盤輸入電路

圖46.4X4鍵盤輸入電路圖

  

  在本次的製作中鍵盤輸入電路可說是一大特點,因為筆者以和傳統完全不一樣的方式設計了這個4X4鍵盤電路,不僅發揮了Arduino Uno模組板的優點,更精簡了電路的複雜度。所謂的4X4鍵盤就是把16個按鍵以4行4列的方式排列,然後將此4行4列按鍵的接腳以垂直和水平的方向並接在一起,構成對外只有8根接腳的一種架構,這樣一來只需8根I/OPin接腳就可以偵測到16個按鍵的輸入,當然要付出的代價就是軟體程式會變得比較複雜。一般我們在使用時並沒有規定那些腳要當成輸出那些腳要當作輸入,全看使用者自己的規畫;不過一般都是4根掃瞄輸出腳配4個掃瞄輸入腳,否則會無法全部偵測到

可是在圖46的電路圖中讀者們可以發現,整個4X4鍵盤只用了1條I/OPin接腳(即圖中的Analog_In,也就是Uno板的A0輸入腳),在4X4鍵盤的下方有4個10K電阻(RK1~RK4)所組成的分壓電路,分別接到4X4鍵盤四組垂直共同點上,而水平共同點則直接或是透過RK5~RK7這3個電阻接到VCC5V。這個電路的工作原理其實很簡單,以圖46的電路來說,4X4鍵盤最上面一排按鍵(即按鍵’1’~’3’與’A’)的水平共同接腳是接在VCC5V上,所以當這四個按鍵分別被按下時,透過RK1~RK4這四個電組所組成的分壓電路,在A0輸入腳所得到的電壓分別為:

按鍵‘1’ 🡺 VCC5V   (VCC5V直接接在RK1上)

  按鍵‘2’ 🡺 VCC5V/2  (RK1與RK2兩個10K電阻分壓)

按鍵‘3’ 🡺 VCC5V/3  (RK1~RK3三個10K電阻分壓)

按鍵‘A’ 🡺 VCC5V/4  (RK1~RK4四個10K電阻分壓)


而上面第二排按鍵(即按鍵’4’~’6’與’B’)的水平共同接腳則是經過一40K的電阻(即R7)接在VCC5V上,所以當這四個按鍵被按下時,再透過RK1~RK4這四個電組所組成的分壓電路,在A0輸入腳所得到的電壓分別為:

按鍵‘4’ 🡺 VCC5V/5

按鍵‘5’ 🡺 VCC5V/6

按鍵‘6’ 🡺 VCC5V/7

按鍵‘B’ 🡺 VCC5V/8


經過上述方式的推演,我們可得到表二的結果,也就是4X4鍵盤的16個按鍵被按下時UNO板的A0類比輸入上所得到的電壓值,而其中最重要的一點,就是這16個按鍵電壓值都是唯一且沒有相同的!如此一來我們便可以透過測量A0這根類比輸入腳的輸入電壓值來決定是那一個按鍵被按下,這樣我們就可以只使用一隻類比輸入腳來完成我們的4X4鍵盤輸入電路。


按鍵值

分壓電壓

VCC

1/2 VCC

1/3 VCC

1/4 VCC

按鍵值

分壓電壓

1/5 VCC

1/6 VCC

1/7 VCC

1/8 VCC

按鍵值

分壓電壓

2/3 VCC

2/5 VCC

2/7 VCC

2/9 VCC

按鍵值

分壓電壓

4/5 VCC

4/9 VCC

4/13 VCC

4/17 VCC

表二、4X4鍵盤按鍵值與分壓電壓之對照

在表二中所有的分壓電壓值是以電源電壓也就是VCC5V的比例值來表示,如果使用不同的Arduino模組板,可能會使用不同的電源電壓,如3.3V等,只要是RK5~RK7這3個電阻的右端共同點是接到Arduino模組板的電源電壓,而且在做類比轉換時所使用的參考電壓是預設值(DEFAULT),則轉換出來的值都會一樣。詳細的測量與轉換過程會在後面軟體程式設計部份為各位說明。


四.3 LCD顯示器部份電路

圖47.LCD顯示器部份電路圖


這次的專題製作我們是使用市面上常見的英文字形LCD顯示器,這個LCD顯示器可顯示2行每行20個字元;至於它對外共有8根資料腳(D0~D7)與3根控制腳(即致能腳EN、讀寫控制腳R/W和暫存器選擇腳RS),一般來說這類的LCD顯示器可使用8或4位元(D4~D7)的資料匯流排;由於Arduino開發工具已提供了許多跟LCD顯示器有關的指令及副程式,而且有些可以只使用4根資料匯流排(使用LCD顯示器資料匯流排的D4~D7腳),此外如果不去作任何讀取LCD顯示器的動作的話,還可以將LCD顯示器的讀寫控制腳(R/W)直接接到低電位(即只作寫入動作)以省去額外的接腳;為了節省Arduino Uno模組板的I/OPin接腳,本次製作筆者會使用4根資料匯流排(D4~D7)與2根控制腳(致能腳EN和暫存器選擇腳RS)共6條I/OPin腳的內建副程式來控制LCD顯示器。

在圖47的LCD顯示器部份電路圖中,LCD顯示器的D4~D7腳直接接到Arduino Uno模組板的D4~D7腳,至於暫存器選擇腳(RS)、和致能腳(EN)這2隻控制腳,則是分別接到Arduino Uno模組板的D3、D2腳。筆者所使用的LCD顯示器是有背光的類型,而這個背光的光源是採用LED顯示器,它們的電源腳分別是15(VDD)與16(GND)腳;依筆者實際測試的結果,最好在外面加上一個限流電阻,或是像圖50那樣使用電晶體去控制導通與否,否則如果直接接到像是5V這樣的電壓上的話,就可能發生短路現象而燒毀。在本次的製作中LED顯示器的背光電源是透過Q2這個型號為9012的PNP電晶體來控制,而此Q2的基極(Base)是接到Arduino Uno模組板的數位D8腳,如果要讓LCD顯示器的背光點亮,此數位D8腳必須輸出低態(Low)電壓,讓Q2這個PNP電晶體的導通,使LCD顯示器背光電源腳(Pin 15/VDD)連接到VCC5V上。

在圖47中LCD顯示器的第3腳(名稱為VO)是所謂的對比控制電壓腳,這主要是用來調整LCD顯示器所顯示文數字元的視角與對比,或者說顏色的濃淡,如果空接的話在LCD顯示器的螢幕上會看不到任何東西出現;一般都是使用一個10KΩ的半固定電阻去調整LCD顯示器上文數字元顏色的濃淡,如果一時找不到10KΩ的半固定電阻可以把它直接接到地點(GND),不過這麼一來LCD顯示器上所顯示的文數字元會顯得太黑了一點,所以除非不得已筆者不建議這樣使用。


四.4 蜂鳴器、電鎖與出廠設定部份電路

圖48.電鎖與蜂鳴器部份電路圖


在筆者的一些製作中幾乎都會使用到蜂鳴器,它可算是我們系統中一個標準配備了;一般蜂鳴器分為兩類,一種是已經內建頻率產生器及驅動電路,只要接上電源就會發出固定頻率的聲音,這種稱為自激式蜂鳴器;另外一種其內部結構只是單純的線圈加上振動簧片,如果加上電源只會聽到’叩”的一聲,所以必須由外部提供交流信號以產生連續的頻率聲音,這種稱為他激式蜂鳴器;前面的自激式蜂鳴器使用起來很簡單,不過價格較貴,而且所發出的聲音頻率無法改變;而後者他激式蜂鳴器必須外加驅動電路及產生聲音的頻率信號,相對的價格便宜,而且可以依使用者的需求發出各種不同頻率的聲音。在此筆者使用的是後面他激式蜂鳴器,一則省錢,再者彈性比較大,當然程式也就必須跟著配合了。

上述的蜂鳴器如圖48所示是接到Arduino Uno模組板的A1腳(等於數位的D15腳),由於Uno模組板每一個I/O埠腳可輸出40~50mA的電流,這對之前所使用的80X51單晶片微電腦來說算是大很多了,可是像蜂鳴器這類的元件來說一般導通時電流可能到幾百mA的大小,也就是說Uno模組板的I/O埠腳還是法直接驅動蜂鳴器,為了安全起見筆者還是決定加一個編號為Q1的PNP小黑豆型的電晶體(9012)去推動它;所以會選用PNP的電晶體,主要的原因是因為筆者在製作時沿用之前89S51單晶片微電腦實驗板上的電路,,如果改用NPN電晶體的話也是可以,只是要記得程式輸出位準也要跟著改變。

一般使用在門禁控制的電磁鎖其工作電壓幾乎都是直流DC12或V24V,甚至有些是直接使用交流110VAC的市電,不管那一種都不是Uno模組板可以直接推動的,即使使用電晶體也不見得可以都通用,所以在此筆者使用了一個繼電器(即圖48中的”RL1”)去驅動它;由於繼電器的輸出接點和我們的系統可以完全隔離,因此不管使用者所採用的電磁鎖工作電壓是幾伏特都可以使用在我們的系統中。為了簡化我們系統的電源電路所以圖48中的”RL1”這個繼電器是使用5V的工作電壓,其接點電流一般只要有5A以上就可以推動大部份的電磁鎖了,這種規格的繼電器算是一個很小型的繼電器。即使是這樣的小型繼電器,Uno模組板的I/O埠也是無法直接推動,所以還是必須加上一個小黑豆型的電晶體(即圖48中編號為號為”Q3”的2SC945NPN電晶體)作電流放大而之用,而此”Q3”NPN電晶體B的極是由接到Uno模組板的A2腳(即數位的D16腳)。

不管是電磁鎖或是繼電器,都是靠電感性的線圈所產生的磁力來動作,當電源切斷時,電感性的線圈都會產生所謂的反電動勢電壓,而且切斷的時間越短反電動勢電壓越高,為了避免這個高壓將驅動的用零件(如圖48的”Q3”)擊穿或燒毀,一般都會在線圈上並連一個和工作電壓極性顛倒的二極體(一般稱為飛輪二極體)作為放電之用,這就是圖48中繼電器線圈(RL1)旁的”D4”和電磁鎖線圈旁”D5”這兩個二極體的功用。

在圖48中Arduino Uno模組板的A3腳接到了一個名為JP_MASTER的短路接頭(Jumper),這是系統初始化的設定接腳,由於Uno模組板的I/O埠腳設定為輸入時是真正高阻抗輸入,而且是浮接狀態,所以我們最好在外面加上一個提昇電阻(即圖48中編號為為R3的10K電阻),以免在空接時狀態不確定。當我們的系統要作出廠的初始化設定時,必須在電源接上開機前先將此短路接頭短接至地電位,當系統程式在開機測試完後(即圖3的畫面)會偵測這個接腳的狀態,以決定是否要進行出廠的初使化設定;如果短路接頭(Jumper)被短接則輸入狀態是低電位,便會執行初始化設定的功能,反之則是正常的門禁管制功能;一般在出廠後應該讓這個短路接頭保持在開路的狀態,否則系統將無法正常的使用。


四.5 RFID讀寫器模組部份電路

本次製作所使用的RC522模組的外觀如照片1所示,其對外的接腳由上而下依序為:

Pin Num.   1     2     3     4     5     6      7     8    

3.3V  RST  GND  IRQ  MISO  MOSI  SCL  SDA


除了3.3V的電源與地點之外,只有第4腳的”IRQ”沒有被用上;還好我們的UNO模組板有提供3.3V的電源輸出,這樣一來我們就不用再準備一個3.3V的穩壓電路。我們採用的這片RC522模組板使用的是所謂的SPI介面,在Arduino家族系列所有的模組板都只有一組SPI介面,而且佔用了固定的I/O接腳,所以讀者們務必按照前面表一的所列的腳位來連接。

所謂的SPI(Serial –Peripheral Interface bus)介面又稱為四線同步序列資料協定(Four - Wire bus protocol),是由SS(Slave Select)SCK(Serial Clock)、MOSI(Master Out Slave IN)MISO(Master In Slave Out)這四種功能的信號線所構成;在一個系統會有一個Master(在此即為UNO板本身)來控制所有資料匯流排的傳輸,而所謂的Slave則可以不只一個,在UNO板上使用D10作為SS(選擇Slave)的控制輸出,如果系統上Slave不只一個,就必須使用其他的數位輸出腳作為其它Slave的SS選擇腳,而其它的三根接腳則可以給所有的Slave共用。RC522的Pin 8(SDA)在此就等於SPI介面的SS(選擇Slave)輸入腳,Pin7(SCL)則是SCK(Serial Clock)腳

圖49.RFID讀寫器模組部份電路圖


在圖49的”RFID讀寫器模組電路圖”中就如前面所述,Arduino Uno模組板的D10也就是SS(選擇Slave)的控制輸出是接RC522的Pin 8,D11腳(MOSI)接到RC522的Pin 6,D12(MISO)、D13(SCK)腳則分別接到RC522的Pin 5、Pin 7;除此之外RC522還有一根重置腳(即Pin2,RESET)也必須用上,而這則是由UNO板的D9來控制。

在使用Arduino族系模組板的SPI介面時,除了必須使用特定的接腳之外,在開發程式時也必須引用到<SPI.h>這個函式庫,如此才能呼叫到已經設計好的函式或副程式,這麼一來便可以大大的節省開發者的時間與精力。


沒有留言:

張貼留言

陸、全體程式列表

#include <LiquidCrystal.h> #include <EEPROM.h> #include <SPI.h> #include <MFRC522.h> /* * Signal     Pin            ...