GPSモジュールとArduinoとの通信

Arduino UNOにはシリアル通信用のピンが1セット準備されているのだが、これは、シリアル通信変換回路を通じてUSBコネクタに通じているようである。
余談になるが、2017年の大会中の出来事で、デバッグ中にUSBケーブルをつけたままロボットカーが走り出してしまいUSBポートを物理的に破壊してしまった。(Arduino Unoではないが。)USBポートの破壊による回路欠損はその場ではんだごてを使って応急処置ができたものの、USBコネクタは使い物にならなくなってしまった。その時は、パソコンとシリアル端子を接続することで無事にダウンロードをすることができ九死に一生を得た。

UNOの場合は、シリアル通信が1セットだけである。しかし、実際のアプリ作成には、Arduino IDEのシリアルモニタでプログラムの動作を確認しながらGPSモジュールの通信を行うために、複数のシリアル通信を用いる必要がある。
複数のシリアル端子を持っているArduino MEGAを使うという手もあるが、Arduinoは入出力に使う端子を利用してシリアル通信を利用できる。
ソフトウェアシリアルと呼ばれており、ライブラリが準備されている。

作成したプログラムのデバッグ用にはUSB経由のシリアル通信を用い、GPSモジュールとの通信にはソフトウェアシリアルを用いるということである。下記はArduinoとGPSモジュールを接続してArduino IDEのシリアルモニタで観測した様子である。

配線は、Arduino UNIの5V,GNDと5番、6番の各ピンを使用した。Arduino IDEのスケッチは下記のように組んでみた。ソフトウェアシリアルを組み込み、GPS_Serialと名前をつけて、5番、6番のピンを指定した。
その後、シリアルモニタ用には115200kbpsの通信速度を、GPSモジュール用のGPS_Serialには9600bpsの通信速度を定義した。プログラムとしては、ただ単にソフトウェアシリアルのバッファにたまった電文を読み(read)、USBを経由するシリアルに書き込んで(write)しているだけである。
これでとりあえずGPSモジュールからの信号もArduinoの中に取り入れたことになる。

#include <SoftwareSerial.h> // Software Serial library

SoftwareSerial GPS_Serial(5,6); // 5:RXD, 6:TXD

void setup() {
 //***** set serial port speed (bps)
 Serial.begin(115200); // USB
 GPS_Serial.begin(9600); // Software Serial setting for GPS module
}

void loop() {
 if (GPS_Serial.available()) {
   Serial.write(GPS_Serial.read());
 }
}