原因
網絡上有不少怎么讓Arduino的5V電平轉換成3.3V電平,從而和工作在3.3V下的芯片相互溝通的教程。但是如果想驅動高於5V電壓的芯片,就找不到教程了。因此今天我來介紹一種方式,能讓Arduino的OUTPUT口和需要5~12V的電子元件進行通信。下文以12V為例。
效果
- 能夠達到單向(從Arduino到12V芯片)通信的目的
- Arduino引腳輸出的電平會被取反,即Arduino輸出HIGH,芯片卻收到LOW,反之亦然。
硬件准備
- Arduino一個
- 開關型NPN三極管(8050即可)一個
- 4.7K,10K電阻各一個(貌似不是這個阻值也可以,只要不要太小即可)
電路連接
面包板圖:
(假設右邊那個nano是我們需要驅動的12V的東西)
原理圖:
軟件開發
一定要記住:Arduino引腳輸出的電平會被取反,即Arduino輸出HIGH,芯片卻收到LOW,反之亦然!只要知道這一點,剩下的事情和開發普通OUTPUT引腳都差不多了。
我們先弄一個測試工程試試看。
在測試工程中,我們用萬用表的電壓表(20V擋位)來模擬12V芯片,即萬用表紅線接圖中藍線,萬用表黑線接地(圖中黑線)。因為芯片的INPUT模式相當於一個電壓表,所以可以這么替代來看效果。當12V芯片應當收到HIGH時,我們的萬用表上就會出現接近12V的電壓;收到LOW則出現0V。
建立一個ino工程,代碼如下:
#define TEST_PIN 7 void setup(){ pinMode(13,OUTPUT); pinMode(TEST_PIN,OUTPUT); } void loop(){ digitalWrite(13,!digitalRead(13)); digitalWrite(TEST_PIN,!digitalRead(TEST_PIN)); delay(2000); }
連接電路,查看效果。如果一切正常,你將會看到,當ino上的小燈亮起的時候,萬用表顯示0V;熄滅時顯示12V。
原理說明(針對沒基礎的人)
三極管這東西高中物理居然不教...因此我自學研究了半天才勉強搞懂一點點。感覺很多書/教程講的都太復雜了,像什么阿爾法值,貝塔值,放大倍數什么的,真正應用的時候不一定用得上,因此我這里簡單講一講三極管用得上的部分。
三極管有兩種類型,NPN和PNP,我這里講一講NPN,即這篇文章中用到的那種。首先,我們要記住這張圖和它的三個引腳對應的說法:C(集電極),B(基極),E(發射極)(想搞懂名稱的自己看原理去)。
我們首先來看有箭頭的那一條路徑(B->E):這條路最簡單,完全不用考慮C端發生了什么,而是幾乎可以看成一個B->E的二極管。B電壓大於E一定程度(即B到E有足夠大的電勢差,一般是0.3V之類),就會有電流,反之則沒有。我們的電路中,B接的是Arduino引腳。因此,當Arduino HIGH時,BE有5V電位差,但是有一個限流電阻,因此有微小的電流;反之沒有。
然后再看另一條路徑,C->E:這一條就悲催的多了,完全被B->E那一條管着。如果BE沒有電流,不管發生什么,CE都不會有電流,這是可以看成C、E之間斷開了。如果BE有電流,才會允許CE產生電流。在我們的電路中,BE有電流則CE連通,即C點接地,於是12V芯片收到LOW;反之,收到HIGH。其實這一部分單獨看,就是一個上拉電阻。圖見下。
順便說一下“電流倒灌”的問題:如果現在三極管的部分換成一塊導體,那么很明顯,C電壓高於B,因此會有灌入B的電流,從而造成Arduino出各種各樣的問題。但是我們的電路中沒有這個問題(確實實踐測試過了),這是因為三極管可以幫助B不被倒灌。但是據傳說,如果C電壓高於B太多,那么倒灌照樣會發生。如果真的發生倒灌,一個(可能)可行的策略是在B處安裝一個整流二極管,不讓電流倒着流動。
鳴謝
感謝阿古(古作坊坊主)在在電路方面的指導!