행복한 하루

아두이노 나노(Arduino nano) 33 IoT 버전 부족한 시리얼 포트 방법(SoftwareSerial 대체(?)) 본문

IoT

아두이노 나노(Arduino nano) 33 IoT 버전 부족한 시리얼 포트 방법(SoftwareSerial 대체(?))

변화의 물결 2021. 6. 27. 21:55

 

 

안녕하세요.

 

이전 내용 중에 아두이노 나노 IoT 33에 SoftwareSerial.h 가 지원하지 않는다고 하고는 해결책을 제시하지 못하고 대충 마무리하였다.

 

 그래서 이번에 다시 시리얼 통신을 할 일이 있어 찾아보다가 다른 방법이 있어 공유드립니다. 역시 문제에 부딪쳐야 조금 자세히 보게 되는 듯합니다.

 1. 하드웨어적 시리얼 사용방법

  - 나노 시리즈가 동일하게 물리적으로 다운로드하는 시리얼 포트(시리얼 데이터 출력하는 포트)를 제외하고 한 개를 추가로 시리얼 포트를 사용할 수 있도록 핀을 사용할 수 있도록 하고 있습니다.

Pin Map을 보면 TX1, RX0이라고이라고 PB22, PB23 핀을 사용할 수 있습니다.

http://www.getmicros.net/nano33-iot-and-wifi-example.php

 

 

  - 소프트웨어로 핀을 정하는 것이 아니기 때문에 Serial1은 고정된 핀이라고 보시면 되고 특별한 설정 없이 초기화만 해주면 바로 사용 가능합니다. 그래서 외부에 TTL 통신을 하는 소형 센서나 MCU와 바로 연결해서 사용해서 받은 값을 디버깅(Serial.write) 할 수 있습니다.

 

  예로 온도 센서 데이터를 시리얼(Serial1)로 받아서 디버깅 포트로 출력 시

#include <Arduino.h>

void setup() {
  Serial.begin(9600);
  Serial.println("Start Serial...");

  Serial1.begin(9600); // Hardware Tx1, RX0 Pin
}

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

  

 - Serial2라고 선언해도 컴파일 에러가 나지 않는데 이것은 내부적으로 NINA-W102과 사용하는 것으로 보시면 됩니다. 직접적으로 사용할 물리적 포트는 아닙니다.

  

 

2. 소프트웨어적 시리얼 사용방법 (?)

  - wiring_private.h 선언해서 pinPeripheral 함수 등을 사용할 수 있게 해 줍니다.

  - 소프트웨어적 방법이라고 했지만, 몇 가지 sercom을 바뀌어서 해보았지만, 핸들러 등록 시 충돌 에러가 나서 사용하지 못했습니다.  이미 아래와 같이 등록되어 있기 때문이라고 생각됩니다.

 

SERCOM2 for SPI NINA

SERCOM3 for MOSI/MISO

SERCOM4 for I2C bus

SERCOM5 for Serial debugging (USB)

 

 

  - 최종적으로 시리얼 포트로 사용 가능했는 핀은 SERCOM0(D5, D6)과 SERCOM(D13, D8)으로 사용 가능하였습니다.

 

Uart swSerial (&sercom0, 5, 6, SERCOM_RX_PAD_1, UART_TX_PAD_0); //RX, TX

Uart swSerial (&sercom1, 13, 8, SERCOM_RX_PAD_1, UART_TX_PAD_2);

 

 - 함수를 조금 설명하자면, swSerial 사용자 정의한 Uart 객체 이름이고 함수 인자를 보면, (sercomN의 주소 값, RX pin number, TX pin number, RX_PAD number, TX_PAD number)로 되어있습니다. 현재 상황으로 보면 인자(Parameter)도 변경할 수 없어 보이긴 합니다.

 

  시리얼 통신을 하기 위한 핀으로 바꿔주는 작업을 하려면 여러 가지 레지스터를 변경해주어야 하는데, 이미 만들어진 함수로 pinPeripheral(13, PIO_SERCOM_ALT); 편하게 사용할 수 있습니다.

 

  - 시리얼 핸들러를 함수를 만들어줍니다. 내부 만들어진 함수가 호출될 때 사용자 정의로 만든 객체가 불러질 수 있도록 연결시켜줍니다. 함수 콜백 함수라고 보시면 됩니다.

 

void SERCOM1_Handler()

{

    swSerial.IrqHandler();

}

  

#include <Arduino.h>
#include "wiring_private.h"

//Uart swSerial (&sercom0, 5, 6, SERCOM_RX_PAD_1, UART_TX_PAD_0); //RX,TX
Uart swSerial (&sercom1, 13, 8, SERCOM_RX_PAD_1, UART_TX_PAD_2);
// Attach the interrupt handler to the SERCOM
void SERCOM1_Handler()
{
    swSerial.IrqHandler();
}

void setup() {
  // Reassign pins 5 and 6 to SERCOM alt
  pinPeripheral(13, PIO_SERCOM_ALT);
  pinPeripheral(8, PIO_SERCOM_ALT);

  // Start my new hardware serial
  swSerial.begin(9600);

  Serial.begin(9600);
  Serial.println("Start Serial...");

}

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

  

  완벽하게 SoftwereSerial.h처럼 원하는 핀을 사용할 수 있는 것은 아니지만, 하드웨어 연결 시, 시리얼통신을 위해 제어 포트와 중복되는 핀을 피해서 사용할 수 있지 않을까 합니다.

 

  그리고 아직 사용방법을 완벽하게 이해하지 못해서 찾아본 링크들을 많이 걸어 두었습니다.

현재 글은 부족한 내용이 있으니 링크들을 보며 참고하셔도 도움이 되시리라 생각됩니다.

 

감사합니다.

 

참고로 아두이노 나노 33 IoT 회로도가 있어 공유드립니다.

arduino-nano-33-iot-schematic.1.png
0.21MB

 

 

<참고사이트> 

1. SoftwareSerial for Arduino Nano 33 IoT

https://stackoverflow.com/questions/57175348/softwareserial-for-arduino-nano-33-iot

2. Serial communication nano33Iot and SERCOM_Handler()

https://forum.arduino.cc/t/serial-communication-nano33iot-and-sercom_handler/696264

3. ArduinoCore-samd/variants/nano_33_iot/variant.h

https://github.com/arduino/ArduinoCore-samd/blob/master/variants/nano_33_iot/variant.h

4. 아두이노 M0( SAMD21G )에서 새로운 serial 만들기

https://velog.io/@wimes/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-M0-SAMD21G-%EC%97%90%EC%84%9C-%EC%83%88%EB%A1%9C%EC%9A%B4-serial-%EB%A7%8C%EB%93%A4%EA%B8%B0-qfk36n99m7

5. Arduino Nano 33 IoT: распиновка, схема подключения и программирование

http://wiki.amperka.ru/products:arduino-nano-33-iot 

 

 

Comments