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重開機,這條連線也不會斷掉,不需重新登入。

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



參考資料:

27 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
  9. 你好
    因為學校專題 看到了這篇
    我們買了 RS232 to TTL 晶片
    連接上樹莓派
    PC上的COM Port 也有出來
    但是 putty 連接的時候完全沒反應
    想請問會是甚麼問題?
    謝謝

    ReplyDelete
    Replies
    1. 線接錯了,

      putty的連線設定錯了,

      COM Port的設定錯了。

      Delete
  10. Anonymous11/9/17 13:26

    想請問一下這個方法(USB TO TTL)也適用於Arduino 晶片上嗎? 我想用電腦與Atmega328做序列溝通(寫與讀),電腦端我是用python,若是用usb直接連接到uno的話一切都沒問題,可以寫進uno也可以讀出資料;但若是跟328我發現讀出來的都是空白值,不過我在看你文章前用的是usb轉rs232的線然後把rs232端的tx,rx與gnd跳線到328上,不知道是不是因為這樣才不行。

    ReplyDelete
    Replies
    1. 可以。

      請參考
      http://yehnan.blogspot.tw/2013/09/arduino_9.html

      Delete
  11. 想請問一下,
    可以更動TX和RX的位置嗎?
    原本設定是在GPIO14和15,
    可以更改成其他GPIO的位置嗎?

    ReplyDelete
    Replies
    1. 呃,那是從rpi的主晶片拉出來,應該是固定的。

      Delete
  12. 想請問一下raspberry用RX/TX與Arduino傳程式直接對接加地線就可以了嗎?
    如果可以序列埠要選哪一個阿?

    ReplyDelete
    Replies
    1. 請參考 https://oscarliang.com/raspberry-pi-and-arduino-connected-serial-gpio/

      Delete
  13. 不好意思再請教一下 按理面的方法可是在我的Raspi3上,/ etc / inittab文件不存在。
    我有禁用串行getty服務:
    sudo systemctl stop serial-getty@ttyAMA0.service

    sudo systemctl disable serial-getty@ttyAMA0.service
    但還是Pi還是讀不到Arduino

    ReplyDelete
    Replies
    1. 你的Raspbian比你給的網路文章還新,已經改用systemd了,所以沒有inittab。

      嗯,有什麼錯誤訊息嗎?

      Delete
  14. 這裡面有比較詳細的介紹
    https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/

    ReplyDelete