2020年5月7日木曜日

raspberry pi 3 でGPIO UART



UARTのGPIOピン

UARTの送信ピン及び受信ピンは、それぞれ、GPIOヘッダーの8番ピン(TXD)、10番ピン(RXD)に割り当てられています。(SoCのGPIO14番ピン及び15番ピン)

UART0をシリアル通信で使用する方法

1.Linuxのシリアルコンソールを無効化します。
Raspbianをインストールした時点では、プライマリUART(/dev/serial0)がLinuxのシリアルコンソールとして使用されています。シリアル通信で使用するため、Linuxのシリアルコンソールとして使用されないように変更します。
【修正前】
pi@raspberrypi:~ $ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=0af269bc-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
/boot/cmdline.txtを以下のとおり編集します。
Linuxシリアルコンソールに関する項目(console=serial0,115200)を削除し、その他はそのまま残します。
pi@raspberrypi:~ $ sudo vi /boot/cmdline.txt
console=serial0,115200 ← この項目を削除する。
【修正後】
pi@raspberrypi:~ $ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=PARTUUID=0af269bc-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
2.シリアル通信にUART0を使用するように変更します。
以下のような方法があります。
  1. Bluetoothを無効化する方法
    Bluetoothを使用しない場合は、Bluetoothを無効化します。これにより、UART0がGPIOヘッダーの8番ピン(TXD)、10番ピン(RXD)に割り当てられ、シリアル通信で使用することがきます。
    /boot/config.txtファイルを以下のとおり編集します。
    pi@raspberrypi:~ $ sudo vi /boot/config.txt
    
    ・・・
    dtoverlay=pi3-disable-bt ← この行を追記する。
    ・・・
    
    プライマリUART(/dev/serial0)としてUART0(/dev/ttyAMA0)が割り当てられ、セカンダリUART(/dev/searal1)として、miniUART(/dev/ttyS0)が割り当てらます。
    pi@raspberrypi:~ $ ls -l /dev
    ・・・
    lrwxrwxrwx 1 root root           7 Mar 14 10:17 serial0 -> ttyAMA0
    ・・・
    lrwxrwxrwx 1 root root           5 Mar 14 10:17 serial1 -> ttyS0
    ・・・
    crw--w---- 1 root tty     204,  64 Mar 14 10:17 ttyAMA0
    ・・・
    crw-rw---- 1 root dialout   4,  64 Mar 14 10:17 ttyS0
    ・・・
    
    次に、UARTで通信を行うBluetoothモデムを初期化するサービスを無効化します。
    pi@raspberrypi:~ $ sudo systemctl disable hciuart
    Removed /etc/systemd/system/multi-user.target.wants/hciuart.service.
    最後に、再起動を行います。
  2. Bluetoothとの通信にminiUARTを使用する方法
  3. シリアル通信を行うとともに、Bluetoothを使用する場合は、Bluetootモジュールとの通信にminiUARTを使用するように変更します。これにより、UART0をシリアル通信で使用することができます。
    /boot/config.txtファイルを以下のとおり編集します。
    pi@raspberrypi:~ $ sudo vi /boot/config.txt
    
    ・・・
    dtoverlay=pi3-miniuart-bt ← この行を追記する。
    ・・・
    
    プライマリUART(/dev/serial0)としてUART0(/dev/ttyAMA0)が割り当てられ、セカンダリUART(/dev/searal1)として、miniUART(/dev/ttyS0)が割り当てらます。
    pi@raspberrypi:~ $ ls -l /dev
    ・・・
    lrwxrwxrwx 1 root root           7 Mar 14 10:17 serial0 -> ttyAMA0
    ・・・
    lrwxrwxrwx 1 root root           5 Mar 14 10:17 serial1 -> ttyS0
    ・・・
    crw--w---- 1 root tty     204,  64 Mar 14 10:17 ttyAMA0
    ・・・
    crw-rw---- 1 root dialout   4,  64 Mar 14 10:17 ttyS0
    ・・・
    
    次に、GPUのコアクロックを固定し、シリアル通信のボーレートが変化しないようにします。
    /boot/config.txtファイルを以下のとおり編集します。
    pi@raspberrypi:~ $ sudo vi /boot/config.txt
    ・・・
    core_freq=250 ← この行を追加する。
    
3.以上で、GPIOを使用してシリアル通信を行うことができます。

CU でターミナル

にラズベリーパイと USB シリアルケーブルとを接続します。USB シリアルケーブルの黒(GND)をラズパイの6番ピン、白(UART TXD(14))を8番ピン、緑(UART RXD(15))を10番ピンにそれぞれ接続します。赤は結線の必要がないので宙ぶらりんのままです:
IMG_2932


次に Ubuntu 側の準備です。実は特別にデバイスドライバを準備することもなく、そのまま認識されます。が、ただ認識しただけでは通信はできないため、そのための準備が必要です。

まず、今回のシリアル通信には cu コマンドを使います。なので、まずは cu をインストールします:
$ sudo apt-get install cu

次にシリアルポートの確認と設定を行います。Ubuntu の USB ポートに USB シリアルケーブルを接続し、次のコマンドを入力して、ちゃんと認識できているかどうかを確認します:
$ ls -l /dev/serial/by-id/

USB シリアルケーブルが正しく認識できていると /dev/ttyUSB0 といった感じで最後に 0(ゼロ)が付いたデバイスとして認識されます。今回は /dev/ttyUSB0 として認識されていると仮定して以下の説明を続けます:
20180814a


/dev/ttyUSB0 の権限を変更します:
$ sudo chmod 666 /dev/ttyUSB0

ここまでの手順で準備が完了しました。最後に cu コマンドで目的のデバイスに接続します。その際にボーレートを 115200 bps に指定して接続します:
$ sudo cu -s 115200 -l /dev/ttyUSB0

成功するとこんな感じでラズパイのログインプロンプトが現れ、ログインできます:
20180814


モニタがないとか、無線LAN がないとか、無線 LAN の環境が普段と違う時(の無線 LAN の設定を変えたい時)でもラズパイを使えて、とても便利な接続方法です。アナログ最強!


0 件のコメント:

コメントを投稿