Raspberry Pi 3 シリアルコンソール&シリアル通信
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
※上記設定はPC上からの場合で、RPi3上から設定する場合は/boot/下の「config.txt」および「cmdline.txt」を修正する事で修正可能
ちなみにLinuxコンソール上から、シリアル通信する場合
【通信速度設定】
$ stty -F /dev/serial0 115200
【文字列送信】
$ echo "hello" > /dev/serial0
or
$ echo "hello" > /dev/serial1
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 の設定はしておく事)
シリアルコンソールでなく、プログラム等でのシリアル通信のための設定
(上記の 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
お世話になります。
返信削除RPI3にシリアルでGPSを繋ぎたいと思い、色々調べていてこの記事に行き当たりました。
そこで非常に初歩的な質問ですが、どうしても理解出来ない点を教えて頂けると嬉しいです。
RPI3では、Bluetoothが追加されてGPIOでシリアル通信するには。。。というのはだいたい理解したのですが。。。
用語で、シリアルコンソールとシリアル通信の違いが良くわかりません。
というのもGPSモジュールをつなぐのはシリアルコンソールですよね?
そしてGPSモジュールと通信するのはシリアル通信ですよね??
という自分なりの理解なのですが、GPSモジュールを繋いで例えばgpsdなどのアプリで情報をやり取りする場合は
GPSモジュールは物理的にシリアルコンソールにつながっていてRPI3とシリアル通信することになると思うのですが、
殆どこの関連情報だと、シリアルコンソールを殺してシリアル通信するには。。。というような解説になっています。
このあたりが私なりに色々調べたのですが、何を言っているのかわからない部分なのです。
GPSモジュールを接続してRPI3にインストールしたアプリを使って通信するなら両方(シリアルコンソール/シリアル通信)
生かしておかないといけないんじゃ????となってしまうのです。
この点についてもしわかりやすく教えて頂けると幸いです。
失礼します。
このような戯れなブログにコメントありがとうございます。
削除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つぐらいが考えられます・・・
上手くいくといいですね。頑張ってください。
ありがとうございます。
削除わかっている人には当たり前すぎることなのでしょうが、初歩の初歩をわかりやすく説明しているサイトが少なかったので、混乱してしまいました。
非常にわかりやすくご説明いただき感謝いたします。
また上手く出来たらご報告いたしますね(≧∇≦)/
すごく参考になりました。ありがとう。
返信削除