2017年1月10日火曜日

Raspberry Pi 3 シリアルコンソール&シリアル通信 [ Raspberry Pi ]

Raspberry Pi 3を購入しました。
Raspberry Pi は BとAと2を持っていたので、同様にシリアルケーブルをつないで、コンソールログインしようとしたら・・・ん???
なーんにもターミナルに表示されません。

世の中の人々に聞いて回ると・・・なんと!デフォルトではうまく接続できないとな!!

しかも、いろいろ解決策があって、ゴチャゴチャしてます。
なので、私のRaspbian環境に合わせて、ここに記しておくことにします。

Raspbianは「2016-11-25-raspbian-jessie.img」を使っています。

まず、良くわからないことだらけなので、調べたことをまとめておきます。


Raspberry Pi 3 (RPi3) の UART(シリアル通信)について・・

1. RPi3 では、Bluetooth機能が加わったため、その通信に従来のシリーズで利用していたURAT0(ttyAMA0)を割り当てた。

2. そのため、RPi3ではシリアルコンソールがデフォルトで利用できなくなった。

3. また、RPi3にはUART1(ttyS0)が加わったのだか、UART1はソフトウェア制御のため、CPUのコアクロックに依存してしまう。

4. RPiのコアクロックはデフォルトでは可変のため、CPUの負荷等で変化する。
   それに依存しているUART1のボーレートも同様に変化してしまうため、通信が失敗する。

5. そこで、解決方法が2つある。1つ目はBluetoothを無効にしてしまう方法、2つ目はCPUのコアクロックを固定してしまう方法

6. Bluetoothを利用しないなら1つ目の方法がよい。
   両方利用したい場合は2つ目の方法になるが、コアクロックを固定するので、ちょっとだけパフォーマンス(性能)が落ちるらしい。

7. どちらのシリアル設定でも、GPIO14(TDX)とGPIO15(RDX)にシリアルポートはマッピングされる。

8. シリアル通信に使うデバイスファイルは
   Bluetoothを無効にした場合:
       /dev/serial0 -> /dev/ttyAMA0
       /dev/serial1 -> /dev/ttyS0
   CPUコアクロックを固定した場合:
       /dev/serial0 -> /dev/ttyS0
       /dev/serial1 -> /dev/ttyAMA0

シリアルコンソールを有効にするには
SDカードをPCで読み込んで、「config.txt」ファイルを修正します。
  • シリアル通信を有効にする
    • enable_uart=1
      を追加する。
  • Bluetoothを無効にして、シリアルコンソール(ttyAMA0)を有効にするには
    • dtoverlay=pi3-miniuart-bt
      を追加する
  • パフォーマンスは落ちるが、Bluetoothもシリアルコンソール(ttyS0)も有効にするには
    • core_freq = 250
      を追加する


シリアル通信を有効にするには
シリアルコンソールでなく、プログラム等でのシリアル通信のための設定
(上記の enable_uart=1 の設定はしておく事)
  • シリアルコンソールを無効にするには
    • SDカードをPCで読み込んで、「cmdline.txt」ファイルを修正
      • console=serial0,115200
        を削除する
    • コンソールの使用を停止・無効にするコマンド(ttyS0の場合)
      • $ sudo systemctl stop serial-getty@ttyS0.service 
      • $ sudo systemctl disable serial-getty@ttyS0.service

※上記設定はPC上からの場合で、RPi3上から設定する場合は/boot/下の「config.txt」および「cmdline.txt」を修正する事で修正可能



ちなみにLinuxコンソール上から、シリアル通信する場合
【通信速度設定】
 $ stty -F /dev/serial0 115200
【文字列送信】
 $ echo "hello" > /dev/serial0
or
 $ echo "hello" > /dev/serial1




4 件のコメント:

  1. お世話になります。

     RPI3にシリアルでGPSを繋ぎたいと思い、色々調べていてこの記事に行き当たりました。
     そこで非常に初歩的な質問ですが、どうしても理解出来ない点を教えて頂けると嬉しいです。

     RPI3では、Bluetoothが追加されてGPIOでシリアル通信するには。。。というのはだいたい理解したのですが。。。

     用語で、シリアルコンソールとシリアル通信の違いが良くわかりません。
     というのもGPSモジュールをつなぐのはシリアルコンソールですよね?
     そしてGPSモジュールと通信するのはシリアル通信ですよね??
     という自分なりの理解なのですが、GPSモジュールを繋いで例えばgpsdなどのアプリで情報をやり取りする場合は
     GPSモジュールは物理的にシリアルコンソールにつながっていてRPI3とシリアル通信することになると思うのですが、
     殆どこの関連情報だと、シリアルコンソールを殺してシリアル通信するには。。。というような解説になっています。
     このあたりが私なりに色々調べたのですが、何を言っているのかわからない部分なのです。
     GPSモジュールを接続してRPI3にインストールしたアプリを使って通信するなら両方(シリアルコンソール/シリアル通信)
     生かしておかないといけないんじゃ????となってしまうのです。

     この点についてもしわかりやすく教えて頂けると幸いです。
     失礼します。

    返信削除
    返信
    1. このような戯れなブログにコメントありがとうございます。

      GPSをシリアルで接続したいということのようですが、私自身はまだやったことがないので、詳しいことはわかりません。
      ただ、わかる範囲でお答えしますが、間違っててもご容赦くださいね。

      まず、シリアルコンソールですが、これはPC等と接続してシリアル通信でRaspberryPiにログインするためのものです。私の覚書なので、この辺は適当にブログに書いてしまっているので、わかりづらかったかもしれません。

      誤解を招いてそうなので、ここで整理しておくと・・・
      シリアル通信とはシリアルポート(TXD,RXDピン)を使用して、通信することすべてを言います。
      シリアルコンソールとは、シリアル通信を利用して、RaspberryPiにログインして操作するためのものです。
      要はシリアルコンソールもシリアル通信を使ってやり取りします。

      他の色々な記事で、「シリアルコンソールを殺してから云々・・・」と書いてあるのは、シリアルポートをシリアルコンソールとして利用すると、シリアルポートにシリアルコンソールのデータ(ログイン・シェル等のやり取りのための文字データ)が流れて来てしまうからです。

      このまま、GPS等のシリアル機器を接続するとGPSにとっては、その余計なデータを受信してしまい誤動作する恐れがあるからです。
      つまり、シリアル通信を利用する時はシリアルポートに接続機器にとって余計なデータが流れて来てほしくないので、シリアルコンソールを殺しておく必要があるのです。

      でも、シリアルコンソールもシリアル機器も接続したいときも、もちろんあると思います。その時はUSBシリアル変換ケーブル等を利用するといいでしょう。RaspberryPiのUSBポートにこの変換ケーブルを接続すればシリアルポートが増えますよ。ちなみに私は変換チップにFTDI社のものが載っているものを使いましたが、刺すだけで/dev/ttyUSB0として認識した記憶があります。(←ちょっと曖昧ですみません)


      jump upさんがどのような環境で利用しようとしているかは不明ですが、方法としては・・・

      1, GPSはシリアルポートに接続して、コンソールはSSHでログインして操作する
      2, GPSはシリアルポートに接続して、HDMIで接続したRaspberryPiから仮想コンソールで操作する
      3. GPSはUSBシリアル変換ケーブル等で接続して、シリアルポートを利用してシリアルコンソールで操作する

      以上の3つぐらいが考えられます・・・

      上手くいくといいですね。頑張ってください。



      削除
    2. ありがとうございます。
      わかっている人には当たり前すぎることなのでしょうが、初歩の初歩をわかりやすく説明しているサイトが少なかったので、混乱してしまいました。
      非常にわかりやすくご説明いただき感謝いたします。
      また上手く出来たらご報告いたしますね(≧∇≦)/

      削除
  2. すごく参考になりました。ありがとう。

    返信削除