Arduino MKR ZeroのUART通信用RX・TXピンを増やしGPSを利用する(UnaMKR Monarch)
日本語記事が無かったのでメモ程度にまとめておく。
Arduino MKR Zeroでは13,14ピンでUART通信が出来る。しかし、複数のUART通信を行いたい場合や既に13,14ピンが使用されている場合、他のピンでUART通信をする必要がある。今回はUnaMKR Monarchを使用する際、13,14ピンがArduinoとの通信に使用されるためこのような問題が生じた。
解決法は「0ピンにTX、1ピンにRXを割り当てる」らしい。詳しく知りたい人は以下のリンクを参照。
簡単にまとめると、「Arduino MKR ZEROはSoftwareSerialが使えない代わりにUART通信ができるピンがあらかじめ決められている」とのこと。それが通常使用される13・14ピンと設定することで使用できる0・1ピンらしい。この際、0ピンはTX、1ピンはRXと決められている。
今回はArduino MKR Zeroで秋月電子のGPSモジュールを使って位置情報を取得してみる。
配線は以下の通り
コードは以下参照
#include <Arduino.h>
#include "wiring_private.h"
#include <TinyGPS++.h>
TinyGPSPlus gps;
Uart gpsSerial(&sercom3, 1, 0, SERCOM_RX_PAD_1, UART_TX_PAD_0);
/* Arduino Setup */
void setup() {
pinPeripheral(1, PIO_SERCOM); //Assign RX function to pin 1
pinPeripheral(0, PIO_SERCOM); //Assign TX function to pin 0
// Serial port for Arduino UART over USB
Serial.begin(9600);
while(!Serial){;}
gpsSerial.begin(9600);
while(!gpsSerial){;}
}
/* Arduino Main Loop */
void loop() {
//GPS取得
smartDelay(1000);
Serial.print("緯度:"); Serial.println(gps.location.lat(), 6);
Serial.print("経度:"); Serial.println(gps.location.lng(), 6);
delay(3000);
}
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
while (gpsSerial.available())
gps.encode(gpsSerial.read());
} while (millis() - start < ms);
}
void SERCOM3_Handler() {
gpsSerial.IrqHandler();
}