2013/09/05

Raspberry Pi:透過序列埠登入系統

Raspberry Pi系統出問題時,若畫面上黑漆漆一片什麼都沒有,便很難找出問題所在,不過Raspberry Pi有Serial(序列)傳輸介面,只要加上「USB轉Serial」能力,便可連接個人電腦,我們就可以登入系統,觀看Raspberry Pi開機初期的訊息,分析可能有問題的地方。

註:若不清楚TTL、UART、Serial的意思,請參考我寫的「Arduino與AVR微控制器相關詞彙」。

我們需要一個叫做USB轉換器的東西,其作用就是在「USB」與「Serial/TTL/UART/RS-232/RS-485」之間做轉換,現今個人電腦大概都沒有RS-232與RS-485,所以這一篇不討論,而Serial/TTL/UART在此其實代表相同的意義,只不過詞彙並未統一、常常混用,也就是說,我們需要的是「USB轉Serial」,但也常以「USB轉TTL」、「USB轉TTL Serial」、「USB轉UART」、「USB轉序列埠」稱呼。

總結而言,從個人電腦,透過USB埠, 中間經由「USB轉Serial」,最後接到Raspberry Pi的序列埠,而Raspbian預設會開啟此序列埠、並啟動主控台,所以連線後便可以看到開機訊息,也可以輸入帳號密碼登入系統,如同實體連接的螢幕鍵盤。

擁有此功能的產品大概分為兩大類,一類含有USB轉換功能晶片的電路板,以下簡稱為轉接卡,另一種則是內建USB轉換功能晶片的線材,以下我簡稱為轉接線。

轉接卡,產品很多。


轉接線,產品也很多。


轉接線的USB頭比一般的還大,打開後便可看見裡頭的晶片與電路板。


不管是哪一類,其核心便是一顆負責USB轉換功能的晶片,譬如FTDI的FT323RL,非常有名,但也昂貴,另外台灣IC設計廠商旺玖科技(Prolific)也有USB介面橋接晶片的產品,此外還有Silicon Labs的CP2102。如果到網路上、拍賣網站上搜尋,便可以找到各家以這些晶片製出來的USB轉換電路板或線材,也可以知道價位。

序列傳輸介面最基本需要四條線路:電源、接地、傳送、接收,但較好的產品,其針腳或連接線數目較多,可能有RTS/CTS流量控制、DTR/DSR、等等,都是一些較為進階的功能,本篇不會使用。

另外要注意轉接產品訊號線路的電壓準位,雖然都可稱為TTL Serial,但有些是5V,有些是3.3V,而Raspberry Pi的GPIO針腳所能承受的電壓為3.3V,所以要注意。

我買了兩項產品,《icshopping_com》USB轉TTL線以及Adafruit的FTDI Friend

轉接線,無名,就是USB轉Serial線,非常便宜,大概是因其內部晶片已經停產了。


轉接卡,產品名叫FTDI Friend,非常貴的USB轉TTL Serial電路板,使用FTDI FT232RL晶片。


FTDI Friend只有電路板,其USB埠為Mini USB,還要準備一條USB-Mini USB的線。


接下來,先安裝「USB轉TTL Serial」產品的驅動程式,主要作用就是將USB埠虛擬成一個序列埠,在Windows裡又稱為COM埠。

我這條轉接線,用的是Prolific的晶片PL2303,所以到Prolific官方網站下載驅動程式,我下載的是PL2303_Prolific_DriverInstaller_v1.8.19.zip,解壓縮後,裡頭有一支PL2303_Prolific_DriverInstaller_v1.8.19.exe檔案,執行便可安裝驅動程式,然後把線插入電腦,將會自動辨識,再到裝置管理員裡確認序列埠號。

找到了「Prolific USB-to-Serial Comm Port (COM4)」,埠號是COM4。當然啦,你的會跟我的不同。


剛剛解壓縮的目錄裡,還有一支執行檔checkChipVersion_v1006.exe,執行後可得到如下畫面,不僅可得知埠號,也可查出產品裡的晶片型號,如下圖,我這條轉接線的晶片是PL-2303 XA / HXA,上網查詢後,發現此晶片已停產,很舊,所以會有相容性問題,網路上常有人抱怨這條轉接線無法用於Win7 、Win8或Android,還好我的Win XP電腦更舊,搭配的剛剛好,呵呵。


至於轉接卡FTDI Friend使用的是FTDI的晶片FT232RL,先到FTDI官方網站下載驅動程式,根據作業系統下載相對應的檔案,我需要的是給32位元的Windows版,所以下載了CDM 2.08.30 WHQL Certified.zip,解壓縮後裡面有支CDM v2.08.30 WHQL Certified.zip,再解壓縮,裡頭便是驅動程式了。

以USB線連接FTDI Friend與電腦,出現新增硬體精靈的畫面,選擇剛剛解壓縮的目錄告知驅動程式在哪,進行安裝,總共需要安裝兩次,首先是USB Serial Converter,


然後才是USB Serial Port,


安裝成功後,便可在裝置管理員裡看到USB Serial Port(COM7),埠號是COM7,當然啦,你的跟我的會不一樣。


以上便是電腦端的準備工作,接下來要連接「USB轉TTL Serial」產品與Raspberry Pi。

首先看看Raspberry Pi的部份,我們需要其中三個,分別是:實體針腳6(接地),實體針腳8(UART TXD),實體針腳10(UART RXD)。


要注意的是,Serial序列傳輸介面的兩端,其TXD與RXD必須跨接,意思是說:
Raspberry Pi的TXD必須接「USB轉TTL Serial」產品的RXD,
而Raspberry Pi的RXD必須接「USB轉TTL Serial」產品的TXD。

接下來要辨識哪條線路代表什麼功能,若是我買的那條轉接線,從顏色便可區別,紅色是電源,黑色是接地,白色是RXD,綠色是TXD。

若是轉接卡FTDI Friend,其板子上也都標示清楚了,共有GND、CTS、VCC、TX、RX、RTS六個針腳,先插入麵包板,並連接適當顏色的線,只需三條,如下。RX接白線,TX接綠線,GND接黑線。


然後連接到Raspberry Pi的針腳,請再次確認,白線(RXD)應接Raspberry Pi的TXD(實體針腳8),綠線(TXD)應接Raspberry Pi的RXD(實體針腳10)。


雖然有5V電源線,不過我不使用,因為USB 2.0規格限制最高只能輸出500mA,但Raspberry Pi Model B需要700mA。

線材都連接妥當後,讓Raspberry Pi開機。在Windows上我使用PieTTY(或PuTTY),將連線類型改成「Serial」,埠號輸入剛剛查出來的,速度則為115200,如下圖。


若需要詳細的序列傳輸設定,如下:

  • Speed (baud rate): 115200
  • Bits: 8
  • Parity: None
  • Stop Bits: 1
  • Flow Control: None
然後便可看到訊息:
Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.6.11+ (dc4@dc4-arm-01) (gcc version 4.7.2 20120731 (prerelease) (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08) ) #474 PREEMPT Thu Jun 13 17:14:42 BST 2013
[    0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[    0.000000] Machine: BCM2708
[    0.000000] cma: CMA: reserved 16 MiB at 1b000000
[    0.000000] Memory policy: ECC disabled, Data cache writeback

...刪除...

最後若開機成功,便會出現登入提示符號,
[    4.188972] udevd[154]: starting version 175
[   14.872503] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
[   15.359861] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
[   16.279010] bcm2708_rng_init=dc8da000
??
Raspbian GNU/Linux 7 raspberrypi ttyAMA0

raspberrypi login:

輸入帳號密碼後即可登入。即使下reboot重開機,這條連線也不會斷掉,不需重新登入。

看到主控台的畫面囉,耶。



參考資料:

16 comments:

  1. Anonymous2/10/13 16:35

    你好!請問Raspberry Pi的GPIO 如何能輸出TTL的信號嗎?
    我想使用Raspberry Pi控制一個一體式的步進馬達(馬達、驅動、控制一體),這個馬達可以經由電腦端的RS232 輸出ascii 的命令進行控制。我查了一下,馬達接電腦RS232的纜線在馬達端是在將信號轉為TTL。
    因為Raspberry Pi沒有RS232的接口,所以我想能不能利用Raspberry Pi透過程式(python),將ascii 的命令轉換,從GPIO輸出TTL信號,透過3.3v轉5v的電路,來控制步進馬達,謝謝!

    ReplyDelete
    Replies
    1. RS-232標準定義的是電氣特性、邏輯電位和各種信號線功能。根據裝置供電電源的不同,±5、±10、±12和±15這樣的電壓都是可能的。不過據我所知,好像以正負12V的電壓準位最常見。

      Raspberry Pi的GPIO已經有輸出輸出TTL Serial的能力,就是我這篇所講的,但它的邏輯電壓準位是3.3V(以及0V,分別代表邏輯訊號的1與0),若想接USB(5V),需要這篇裡說的「USB轉TTL Serial」的東西。

      你需要的是「TTL Serial轉RS-232」的東西,在「3.3V或5V」與「RS-232的正負12V」之間作轉換。知名的有MAX3232這顆IC,必須自己接線路。或是現成的產品,可搜尋關鍵字「RS 232 轉 TTL」,就可以在拍賣網站找到相關產品。譬如這個http://goods.ruten.com.tw/item/show?21105188424242 或 http://www.aroboto.com/shop/goods.php?id=522 (我都沒用過,僅供參考)。



      Delete
    2. Anonymous5/10/13 17:21

      感謝回覆!因為不是電子科系,所以一些基本觀念並不懂,只是剛好有需要這方面的應用,所以才找這方面的資料。

      我查了一下,因為我要控制的步進馬達在與RS232連接上,只有接4條線,在這顆馬達的資料中查到,它的定義是Serial Transimit(TX),Serial Receive(RX),DC+5 Out,GND2 。

      在馬達的文件中指出,和電腦相接的RS232的纜線在馬達端是在將信號轉為TTL。如果Raspberry Pi可以輸出TTL Serial的信號(3.3v),我想是不是用這種邏輯準位轉換http://www.sparkfun.com/products/8745 的方式,將TTL Serial(3.3v),轉換成TTL(5v),這樣就不用在Raspberry Pi上先接個「TTL Serial轉RS-232」,再接了一條馬達的控制纜線(可能是RS 232 轉 TTL),這麼麻煩。

      Delete
    3. 根據你說的,你的馬達使用序列介面傳輸,透過TX與RX傳送接收資料,這點沒問題了。

      有問題的是電壓準位的部份。的確可以使用http://www.sparkfun.com/products/8745將raspberry pi的3.3V轉成5V,但你確定你的馬達所接收的TTL Serial電壓準位是3.3V還是5V呢?

      以下是我的假設:
      電腦-RS232纜線(應該是9針吧)輸出5V電源與接地、TX與RX(5V)-馬達端的RS-232插座-馬達端有RS-232(應該是正負12V)轉TTL Serial(5V)的轉換晶片-馬達

      現在你想將電腦換成raspberry pi,
      1. 將rpi的3.3V轉成12V,就可以使用RS-232插頭插座的方式,與之前一樣。
      2. 將rpi的3.3V轉成5V,不能直接接在馬達端的RS232插座,應該它預期接收的是正負12V,必須跳過那個「馬達端有RS-232(應該是正負12V)轉TTL Serial(5V)的轉換晶片」。

      呃,表達的不好,不知道您能理解嗎?

      Delete
  2. PL2303 歷代晶片(PL2303, PL2303H, PL2303HX, PL2303X, PL2303HXD及PL2303TB等等)的介紹
    http://www.oneping.com.tw/Technical_Articles/t_PL2303DM.htm

    ReplyDelete
  3. 我買了一個RS-232轉TTL Serial模組,從舊電腦的9pin RS-232連接埠,接到模組,再接到Raspberry Pi的TX/RX,也是可以連接/dev/ttyAMA0的主控台。

    ReplyDelete
  4. 看完你的文章想請問我從pc上的com port直接接rs232的txd及rxd到raspberry和你用usb模給轉rs232接到raspberry有何不同,因為我這樣直接接好像出來的字都亂碼,難到電腦上的rs232 port不能直接接嗎

    ReplyDelete
    Replies
    1. PC的COM Port應屬於RS-232規格,其電壓不同於raspberry pi的針腳,不能直接連接。需購買「RS-232轉TTL Serial模組」。

      Delete
  5. 在露天拍賣買了一個USB to TTL,板子上有3.3v、5v的控制jump,輸出排針好像比較精簡只做了四支,
    接上Raspberry Pi(Rev. 2)的針腳4、6、8、10,調成5v接上電腦的usb,Raspberry Pi能直接啟動。
    電腦端putty也能從COM port連上Raspberry Pi。
    此種接法請勿再使用micro USB電源。

    ReplyDelete
  6. Anonymous14/8/14 23:36

    到露天買您說的很便宜的USB to TTL..
    在Win7下回來使用後,經常當機...
    後來在另一個網頁上,有人說這是大陸一家北京時代民芯科技有限公司出產的MxT2303HX, 也就是盜版的PL2303HX... 然怪會那麼便宜...
    但您說的FTDI又太貴,買不下手...
    又在您文章中看到萬平公司做的USB to TTL,使用PL2303HXD晶片, 就買來試看看.. 使用後就一切正常了..傳輸很穩定...

    ReplyDelete
    Replies
    1. 早期晶片的驅動程式,大概不支援新版Windows、或支援程度很差,
      我文章裡也有寫:「發現此晶片已停產,很舊,所以會有相容性問題,網路上常有人抱怨這條轉接線無法用於Win7 、Win8或Android」。

      原來是仿冒品啊,難怪這麼便宜,多謝告知。

      Good for you.

      Delete
  7. Anonymous9/6/16 23:06

    您好,想請問一下,我需要拿RPi來控制rs232界面的裝制,如發票機,如果我不要用USBtoTTL的方式連,而要用GPIO的第14,15腳位的RX,TX來接rs232的連接器,再直接接到發票機,請問一下,有什麼的解決方案嗎,謝謝

    ReplyDelete
    Replies
    1. 拿兩隻腳當做RX與TX,這是最簡單的作法。
      rs232介面,裡頭有很多腳位,並不是只要rx與tx而已。
      你確定你的rs232介面的裝置,僅需要rx/tx就可以控制?

      > 用GPIO的第14,15腳位的RX,TX來接rs232的連接器
      什麼是「rs232的連接器」?

      rpi的gpio腳位是3.3V,rs232應該是-12V~12V(不一定),
      你需要 TTL(3.3V)轉RS-232的轉接器。通常會使用max3232這顆晶片。

      Delete
  8. 您好:
    我有學校專題需要使用USB to Serial
    報告投影片 可以引用 您的文章嗎??

    ReplyDelete