みずみのぶろぐ

釣りとかラズパイとか適当に

Arduino MKR ZeroのUART通信用RX・TXピンを増やしGPSを利用する(UnaMKR Monarch)

 日本語記事が無かったのでメモ程度にまとめておく。

 

Arduino MKR Zeroでは13,14ピンでUART通信が出来る。しかし、複数のUART通信を行いたい場合や既に13,14ピンが使用されている場合、他のピンでUART通信をする必要がある。今回はUnaMKR Monarchを使用する際、13,14ピンがArduinoとの通信に使用されるためこのような問題が生じた。

www.kccs-iot.jp

解決法は「0ピンにTX、1ピンにRXを割り当てる」らしい。詳しく知りたい人は以下のリンクを参照。

www.arduino.cc

forum.arduino.cc

www.denshi.club

簡単にまとめると、「Arduino MKR ZEROはSoftwareSerialが使えない代わりにUART通信ができるピンがあらかじめ決められている」とのこと。それが通常使用される13・14ピンと設定することで使用できる0・1ピンらしい。この際、0ピンはTX、1ピンはRXと決められている。

 

今回はArduino MKR Zeroで秋月電子GPSモジュールを使って位置情報を取得してみる。

akizukidenshi.com

配線は以下の通り

f:id:mizumi_1593:20210711143304j:plain

コードは以下参照

#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();
}

 

 

見たままで編集するとソースコードが上手く表示されないらしい。今度からはMarkdownとか使う。