반응형

ESP32 두 대 사이에 데이터를 주고받으려면 보통 두 보드를 같은 공유기에 연결하고 HTTP나 MQTT 같은 방식으로 통신한다. 하지만 이 방법은 공유기가 반드시 있어야 하고, 전원을 켤 때마다 공유기에 접속하는 데 수 초가 걸리며, 공유기가 없는 야외나 공유기와 멀리 떨어진 곳에서는 사용할 수 없는 한계가 있다. 블루투스를 사용하면 공유기는 필요 없지만 페어링과 연결 과정이 번거롭고 통신 거리도 짧다.

ESP-NOW는 Espressif에서 만든 무선 통신 방식으로, 공유기 없이 ESP32끼리 MAC 주소만으로 바로 데이터를 주고받을 수 있다. 연결 과정이 없어 전원을 켜자마자 통신할 수 있고 반응 속도도 매우 빠르다. 이 글에서는 ESP-NOW의 특징을 Wi-Fi, BLE와 비교하고, MAC 주소 확인 방법과 버튼으로 다른 ESP32의 LED를 켜는 송신, 수신 예제 코드를 소개한다.

 

ESP-NOW 통신 구조 (Initiator와 Responder)

 

출처: Espressif ESP-NOW 공식 문서, Apache License 2.0


1. ESP-NOW 소개

ESP-NOW는 ESP32의 2.4GHz Wi-Fi 하드웨어를 그대로 사용하지만, 공유기 접속이나 IP 주소 같은 TCP/IP 과정을 모두 생략하고 Wi-Fi 데이터 프레임에 짧은 데이터를 직접 담아 보내는 방식이다. 데이터를 받을 기기의 MAC 주소를 상대(Peer)로 등록하기만 하면 바로 데이터를 보낼 수 있다.

특징:

  • 공유기가 필요 없으며, 전원을 켠 후 바로 통신할 수 있다.
  • 한 번에 최대 250바이트의 데이터를 보낼 수 있다. 센서 값, 버튼 상태, 명령어 등을 보내기에 충분한 크기이다.
  • 1:1 통신뿐 아니라 1:N(여러 대에 보내기), N:1(여러 대에서 받기), 양방향 통신이 모두 가능하다.
  • 데이터를 보낸 후 바로 딥슬립에 들어갈 수 있어 배터리로 동작하는 센서에 적합하다.
  • ESP32, ESP32-S3, ESP32-C3, ESP32-C6, ESP8266 등 Espressif의 Wi-Fi 칩끼리 서로 통신할 수 있다.

ESP-NOW는 아두이노 ESP32 보드 패키지에 기본으로 포함되어 있어 별도의 라이브러리를 설치할 필요가 없다. 최신 ESP-IDF 5.4 이상에서는 한 번에 보낼 수 있는 데이터가 최대 1470바이트로 늘어난 ESP-NOW v2도 지원하지만, 이 글에서는 모든 보드에서 사용할 수 있는 250바이트 기준으로 설명한다.


2. 주요 사양 및 Wi-Fi, BLE 통신과의 비교

ESP32에서 사용할 수 있는 무선 통신 방식의 차이는 다음과 같다.

항목 Wi-Fi (공유기 경유) BLE ESP-NOW
공유기 필요 불필요 불필요
연결 과정 공유기 접속, IP 할당 (수 초) 검색, 연결 (수 초) 없음 (MAC 주소 등록)
1회 전송 크기 제한 거의 없음 기본 20바이트 (확장 시 수백 바이트) 250바이트 (v2: 1470바이트)
반응 속도 수십~수백 ms 수십 ms 수 ms
통신 거리 공유기 범위 약 10~30m 실내 수십 m, 야외 약 100~200m
연결 기기 수 공유기 성능에 따라 다름 수 대 최대 20대 (암호화 시 최대 17대)
인터넷 연결 가능 불가 불가
스마트폰 연결 가능 가능 불가

 

ESP-NOW는 스마트폰이나 인터넷과는 직접 통신할 수 없지만, ESP32끼리 짧은 데이터를 빠르게 주고받는 데는 가장 간단하고 빠른 방법이다. 인터넷 연결이 필요하면 여러 ESP32의 데이터를 ESP-NOW로 한 대에 모은 후, 그 한 대만 Wi-Fi로 서버에 보내는 방식으로 함께 사용할 수 있다.


3. 준비물 및 연결

이 글의 예제는 ESP32 개발보드 2대를 사용하며, 한 대는 버튼 상태를 보내는 송신기, 다른 한 대는 데이터를 받아 LED를 켜는 수신기로 사용한다.

  • 송신기: 버튼의 한쪽을 GPIO4, 다른 쪽을 GND에 연결한다. 내부 풀업 저항을 사용하므로 저항은 필요 없다.
  • 수신기: 대부분의 ESP32 개발보드는 GPIO2에 파란색 LED가 내장되어 있으므로 그대로 사용한다. 내장 LED가 없는 보드는 GPIO2에 220Ω 저항과 LED를 연결한다.

4. 개발환경 및 MAC 주소 확인

아두이노 IDE에 ESP32 보드 패키지(esp32 by Espressif Systems)가 설치되어 있으면 ESP-NOW를 바로 사용할 수 있다. 이 글의 코드는 보드 패키지 3.x 버전을 기준으로 작성되었다.

ESP-NOW로 데이터를 보내려면 먼저 수신기 ESP32의 MAC 주소를 알아야 한다. 다음 코드를 수신기로 사용할 보드에 업로드하고 시리얼 모니터(115200bps)를 열면 MAC 주소가 출력된다.

#include <WiFi.h>
#include <esp_wifi.h>

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.STA.begin();

  uint8_t mac[6];
  esp_wifi_get_mac(WIFI_IF_STA, mac);
  Serial.printf("MAC 주소: %02X:%02X:%02X:%02X:%02X:%02X\n",
                mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}

void loop() {
}
  • 6~7 Line: ESP32를 Wi-Fi 스테이션 모드로 설정하고 Wi-Fi 기능을 시작한다. ESP-NOW는 스테이션 모드의 MAC 주소를 사용한다.
  • 9~10 Line: 스테이션 모드의 MAC 주소 6바이트를 읽는다.
  • 11~12 Line: MAC 주소를 "24:6F:28:AA:BB:CC" 같은 16진수 형식으로 출력한다.

출력된 MAC 주소는 메모해 두었다가 송신기 코드에 입력한다. 시리얼 모니터에 아무것도 나오지 않으면 보드의 RESET(EN) 버튼을 한 번 누르면 된다.

[이미지: 시리얼 모니터에 출력된 MAC 주소]


5. 예제 코드

1) 송신기 코드

버튼 상태와 전송 횟수를 구조체에 담아 0.2초마다 수신기로 보내는 코드이다.

#include <WiFi.h>
#include <esp_now.h>

uint8_t receiverMac[] = {0x24, 0x6F, 0x28, 0xAA, 0xBB, 0xCC};

typedef struct {
  int count;
  bool button;
} Message;

Message msg;
const int BTN_PIN = 4;
esp_now_peer_info_t peerInfo;

void setup() {
  Serial.begin(115200);
  pinMode(BTN_PIN, INPUT_PULLUP);
  WiFi.mode(WIFI_STA);

  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW 초기화 실패");
    return;
  }

  memcpy(peerInfo.peer_addr, receiverMac, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;
  esp_now_add_peer(&peerInfo);
}

void loop() {
  msg.count++;
  msg.button = (digitalRead(BTN_PIN) == LOW);

  esp_err_t result = esp_now_send(receiverMac, (uint8_t *)&msg, sizeof(msg));
  if (result == ESP_OK) {
    Serial.printf("전송: count=%d, button=%d\n", msg.count, msg.button);
  } else {
    Serial.println("전송 실패");
  }
  delay(200);
}
  • 1~2 Line: Wi-Fi 라이브러리와 ESP-NOW 라이브러리를 포함한다.
  • 4 Line: 앞에서 확인한 수신기의 MAC 주소를 입력한다. "24:6F:28:AA:BB:CC"라면 각 자리 앞에 0x를 붙여 입력하면 된다.
  • 6~9 Line: 보낼 데이터의 형식을 구조체로 정의한다. 수신기 코드에도 똑같은 구조체를 정의해야 한다.
  • 11~13 Line: 보낼 데이터 변수, 버튼 핀 번호, 상대 기기 정보를 담을 변수를 선언한다.
  • 18 Line: ESP-NOW를 사용하기 위해 Wi-Fi를 스테이션 모드로 설정한다. 공유기에는 연결하지 않는다.
  • 20~23 Line: ESP-NOW를 초기화하고, 실패하면 메시지를 출력한다.
  • 25~28 Line: 수신기의 MAC 주소를 상대 기기(Peer)로 등록한다. channel을 0으로 하면 현재 Wi-Fi 채널을 사용하고, encrypt를 false로 하면 암호화 없이 보낸다.
  • 32~33 Line: 전송 횟수를 1 증가시키고, 버튼이 눌렸으면 true, 아니면 false를 저장한다.
  • 35 Line: 구조체 데이터를 바이트 배열로 바꿔 수신기로 보낸다.
  • 36~40 Line: 전송 요청 결과를 시리얼 모니터에 출력한다.
  • 41 Line: 0.2초마다 데이터를 보낸다.

esp_now_send()의 결과가 ESP_OK인 것은 전송 요청이 정상적으로 처리되었다는 의미이며, 수신기가 실제로 받았는지까지 확인하려면 esp_now_register_send_cb() 함수로 전송 완료 콜백 함수를 등록하면 된다. 단, 전송 완료 콜백 함수의 형식은 보드 패키지 버전에 따라 다르므로 사용하는 버전의 예제(파일 -> 예제 -> ESP32 -> ESPNow)를 참고한다.

2) 수신기 코드

송신기에서 받은 데이터를 시리얼 모니터에 출력하고, 버튼이 눌린 상태이면 LED를 켜는 코드이다.

#include <WiFi.h>
#include <esp_now.h>

typedef struct {
  int count;
  bool button;
} Message;

Message msg;
const int LED_PIN = 2;

void onReceive(const esp_now_recv_info_t *info, const uint8_t *data, int len) {
  memcpy(&msg, data, sizeof(msg));
  digitalWrite(LED_PIN, msg.button ? HIGH : LOW);
  Serial.printf("수신: count=%d, button=%d\n", msg.count, msg.button);
}

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  WiFi.mode(WIFI_STA);

  if (esp_now_init() != ESP_OK) {
    Serial.println("ESP-NOW 초기화 실패");
    return;
  }
  esp_now_register_recv_cb(onReceive);
}

void loop() {
}
  • 4~7 Line: 송신기와 똑같은 형식의 구조체를 정의한다. 구조체의 형식이 다르면 데이터가 잘못 읽힌다.
  • 12 Line: 데이터를 받았을 때 자동으로 실행되는 콜백 함수이다. info에는 보낸 기기의 MAC 주소 등이 들어 있고, data와 len은 받은 데이터와 길이이다.
  • 13 Line: 받은 데이터를 구조체 변수에 복사한다.
  • 14 Line: 버튼이 눌린 상태이면 LED를 켜고, 아니면 끈다.
  • 15 Line: 받은 데이터를 시리얼 모니터에 출력한다.
  • 21 Line: Wi-Fi를 스테이션 모드로 설정한다.
  • 23~26 Line: ESP-NOW를 초기화한다.
  • 27 Line: 데이터를 받았을 때 실행할 콜백 함수를 등록한다.
  • 30~31 Line: 데이터 수신은 콜백 함수에서 처리하므로 loop()에는 코드가 없다.

보드 패키지 2.x 버전을 사용한다면 12 Line의 콜백 함수 첫 번째 인자를 const uint8_t *mac으로 바꿔야 컴파일된다. 두 보드에 각각 코드를 업로드하고 송신기의 버튼을 누르면, 공유기 없이도 수신기의 LED가 거의 바로 켜지는 것을 확인할 수 있다.

[이미지: 송신기 버튼을 누르자 수신기 LED가 켜진 모습과 시리얼 모니터 출력]

3) 여러 대와 통신하기

  • 1:N 전송: 송신기에서 여러 수신기의 MAC 주소를 각각 esp_now_add_peer()로 등록한 후, esp_now_send()의 첫 번째 인자에 원하는 수신기의 주소를 넣거나 NULL을 넣으면 등록된 모든 기기로 보낸다.
  • N:1 수신: 여러 송신기가 같은 수신기 주소로 데이터를 보내면 되고, 수신기에서는 콜백 함수의 info->src_addr로 어느 송신기가 보냈는지 구분할 수 있다.
  • 양방향 통신: 두 보드가 서로의 MAC 주소를 상대 기기로 등록하고, 송신 코드와 수신 콜백 함수를 모두 넣으면 된다.

6. 주요 용도 및 주의사항

추천 주요 용도:

  • 무선 리모컨: RC카, 로봇, 조명, 블라인드 등을 버튼이나 조이스틱으로 제어하는 무선 리모컨을 만들 수 있다.
  • 무선 센서 네트워크: 여러 곳에 배치한 온습도 센서, 문열림 센서의 값을 한 대의 ESP32로 모을 수 있다.
  • 배터리 센서: 깨어나서 측정하고 데이터를 보낸 후 바로 딥슬립에 들어가는 방식으로 배터리 수명을 크게 늘릴 수 있다.
  • 공유기가 없는 장소: 야외, 창고, 작업장처럼 공유기가 없는 곳에서 기기끼리 통신하는 장치를 만들 수 있다.

사용 시 주의사항:

  • Wi-Fi 채널 일치: ESP-NOW와 공유기 연결을 함께 사용하는 보드는 공유기의 채널로 동작하므로, 다른 보드들도 같은 채널을 사용하도록 설정해야 통신이 된다.
  • 데이터 크기 제한: 한 번에 250바이트까지만 보낼 수 있으므로 큰 데이터는 나누어 보내야 한다.
  • 전송 보장 없음: 데이터를 받지 못해도 자동으로 다시 보내지 않으므로, 중요한 데이터는 전송 완료 콜백으로 결과를 확인하고 실패하면 다시 보내도록 만들어야 한다.
  • 콜백 함수 처리: 수신 콜백 함수는 Wi-Fi 작업 중에 실행되므로 delay()나 오래 걸리는 작업을 넣지 말고, 데이터만 저장한 후 loop()에서 처리하는 것이 좋다.
  • 보안: 암호화하지 않은 데이터는 다른 기기에서도 받을 수 있으므로 도어락처럼 보안이 필요한 장치에는 암호화(encrypt) 기능을 사용해야 한다.

구매좌표:

 

반응형
반응형

아두이노 우노 R3(Arduino UNO R3)는 아두이노를 처음 시작하는 사용자라면 누구나 한 번쯤 사용해 보는 대표적인 입문용 보드이다. 하지만 8비트 ATmega328P 마이크로컨트롤러(MCU)를 사용하기 때문에 2KB에 불과한 SRAM, 16MHz의 낮은 클럭 속도로 인해 복잡한 연산이나 큰 데이터를 다루기 어렵고, 무선 통신 기능도 없어 IoT 프로젝트에는 별도의 Wi-Fi 모듈을 추가해야 하는 한계가 있었다.

아두이노 우노 R4 WiFi(Arduino UNO R4 WiFi)는 기존 우노의 보드 크기와 핀 배치, 5V 동작 전압을 그대로 유지하면서 MCU를 32비트 Renesas RA4M1(Arm Cortex-M4)으로 바꾸고, ESP32-S3 무선 모듈과 12x8 LED 매트릭스까지 탑재한 보드이다. 이 글에서는 우노 R4 WiFi의 주요 사양을 기존 우노 R3와 비교하고, 개발환경 설치 방법과 LED 매트릭스 및 Wi-Fi 예제 코드를 소개한다.


1. 아두이노 우노 R4 WiFi (Arduino UNO R4 WiFi) 소개

아두이노 우노 R4는 2023년에 출시된 우노 시리즈의 4번째 개정판으로, 무선 기능이 없는 UNO R4 Minima와 무선 기능이 포함된 UNO R4 WiFi 두 가지 모델로 구성된다. 두 모델 모두 메인 MCU로 Renesas RA4M1을 사용하며, UNO R4 WiFi는 여기에 Espressif의 ESP32-S3-MINI-1 모듈을 보조 프로세서로 추가하여 Wi-Fi와 블루투스(BLE) 통신을 지원한다.

사용자가 작성한 스케치는 RA4M1에서 실행되고, 무선 통신이 필요할 때 RA4M1이 ESP32-S3에 명령을 보내 처리하는 구조이다. 따라서 사용자는 기존 우노와 같은 방식으로 코드를 작성하면서 WiFiS3 라이브러리만으로 간단하게 무선 기능을 사용할 수 있다.

특징:

  • 기존 우노 R3와 동일한 보드 크기(68.6 x 53.4 mm)와 헤더 배치를 유지하여 기존 실드(Shield)를 대부분 그대로 사용할 수 있다.
  • 동작 전압 5V를 유지하여 기존 5V 센서와 모듈을 레벨 시프터 없이 연결할 수 있다.
  • 보드 위에 12x8(96개) 빨간색 LED 매트릭스가 있어 별도 부품 없이 글자나 아이콘을 표시할 수 있다.
  • USB 단자가 USB-B에서 USB-C로 바뀌었고, 외부 전원 입력(VIN) 범위가 6~24V로 넓어졌다.

2. 주요 사양 및 UNO R3와의 비교

기존 8비트 기반 우노 R3와 32비트로 업그레이드된 우노 R4 WiFi의 핵심 사양 차이는 다음과 같다.

항목 기존 아두이노 우노 (UNO R3) 신형 아두이노 우노 R4 WiFi
메인 MCU ATmega328P (8-bit AVR) Renesas RA4M1 (32-bit Arm Cortex-M4)
클럭 속도 16 MHz 48 MHz (3배 향상)
플래시 메모리 32 KB 256 KB (8배 증가)
SRAM 2 KB 32 KB (16배 증가)
EEPROM 1 KB 8 KB (데이터 플래시)
무선 통신 없음 Wi-Fi 2.4GHz, BLE 5 (ESP32-S3)
동작 전압 5V 5V
입력 전압 (VIN) 7~12V 6~24V
디지털 / 아날로그 핀 14개 / 6개 14개 / 6개
ADC 해상도 10-bit 최대 14-bit
DAC 없음 12-bit 1채널 (A0)
핀당 출력 전류 20 mA 8 mA
USB 단자 USB-B USB-C
부가 기능 없음 12x8 LED 매트릭스, Qwiic 커넥터, CAN, RTC, OP-AMP, USB HID

 

클럭은 3배, SRAM은 16배 늘어나 R3에서 메모리 부족으로 실행이 어려웠던 그래픽 디스플레이 제어나 여러 센서를 동시에 다루는 코드도 여유 있게 실행할 수 있다. 반면 핀당 출력 전류는 20mA에서 8mA로 줄어들었으므로 사용 시 주의가 필요하다.

 


3. PIN 배열 및 연결

우노 R4 WiFi는 기존 우노 R3와 동일한 위치에 디지털 핀(D0~D13), 아날로그 핀(A0~A5), 전원 핀(5V, 3.3V, GND, VIN)이 배치되어 있어 기존 회로와 실드를 그대로 연결할 수 있다.

[이미지: 아두이노 우노 R4 WiFi 핀 배열도]

1) 디지털 및 아날로그 핀

  • 디지털 입출력 핀 14개(D0~D13) 중 PWM 출력이 가능한 핀은 D3, D5, D6, D9, D10, D11이다.
  • 아날로그 입력 핀 6개(A0~A5)는 analogReadResolution() 함수로 최대 14비트(0~16383)까지 해상도를 높일 수 있다.
  • A0 핀은 12비트 DAC 출력을 지원하여 PWM이 아닌 실제 아날로그 전압을 출력할 수 있다.

2) 통신 핀

  • UART: D0(RX), D1(TX)는 Serial1으로 사용한다. R3와 달리 USB 시리얼(Serial)과 분리되어 있어 업로드 중에도 충돌이 없다.
  • I2C: A4(SDA), A5(SCL) 핀은 Wire로 사용하고, 보드 측면의 Qwiic 커넥터는 Wire1로 사용한다.
  • SPI: D11(COPI), D12(CIPO), D13(SCK)과 ICSP 헤더를 사용한다.
  • CAN: D4(CAN TX), D5(CAN RX) 핀을 지원하며, 실제 CAN 버스에 연결하려면 별도의 CAN 트랜시버 모듈이 필요하다.

3) 추가 커넥터 및 핀

  • Qwiic 커넥터: 3.3V 전용 I2C 커넥터로, 납땜 없이 Qwiic/STEMMA QT 규격 센서를 케이블 하나로 연결할 수 있다.
  • VRTC 핀: 코인 배터리를 연결하면 메인 전원이 꺼져도 내장 RTC(실시간 시계)가 계속 동작한다.
  • OFF 핀: GND에 연결하면 보드의 전원 레귤레이터를 끌 수 있다.

4. 개발환경 설치 (보드 패키지)

우노 R4 WiFi는 기존 AVR 보드와 다른 보드 패키지를 사용하므로, 아두이노 IDE에서 보드 패키지를 먼저 설치해야 한다.

  1. 아두이노 IDE 2.x를 실행한 후 툴 -> 보드 -> 보드 매니저를 선택한다.
  2. 검색창에 "UNO R4"를 입력하고 Arduino UNO R4 Boards를 찾아 설치 버튼을 누르면 된다.
  3. 설치가 끝나면 툴 -> 보드 -> Arduino UNO R4 Boards -> Arduino UNO R4 WiFi를 선택한다.
  4. USB-C 케이블로 보드를 PC에 연결하고 툴 -> 포트에서 해당 COM 포트를 선택해 주면 된다.

Wi-Fi 기능을 사용하는 WiFiS3 라이브러리와 LED 매트릭스를 제어하는 Arduino_LED_Matrix 라이브러리는 보드 패키지에 포함되어 있으므로 별도로 설치할 필요가 없다.


5. 예제 코드

1) LED 매트릭스에 하트 표시하기

보드에 내장된 12x8 LED 매트릭스에 하트 모양을 표시하는 기초 예제이다.

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

byte heart[8][12] = {
  { 0,0,1,1,0,0,0,1,1,0,0,0 },
  { 0,1,0,0,1,0,1,0,0,1,0,0 },
  { 0,1,0,0,0,1,0,0,0,1,0,0 },
  { 0,0,1,0,0,0,0,0,1,0,0,0 },
  { 0,0,0,1,0,0,0,1,0,0,0,0 },
  { 0,0,0,0,1,0,1,0,0,0,0,0 },
  { 0,0,0,0,0,1,0,0,0,0,0,0 },
  { 0,0,0,0,0,0,0,0,0,0,0,0 }
};

void setup() {
  matrix.begin();
  matrix.renderBitmap(heart, 8, 12);
}

void loop() {
}
  • 1 Line: LED 매트릭스 제어용 Arduino_LED_Matrix 라이브러리를 포함한다.
  • 3 Line: LED 매트릭스 객체(matrix)를 생성한다.
  • 5~14 Line: 8행 12열 배열로 하트 모양을 정의한다. 1은 LED 켜짐, 0은 꺼짐을 의미한다.
  • 17 Line: LED 매트릭스를 초기화한다.
  • 18 Line: renderBitmap() 함수로 배열 내용을 LED 매트릭스에 표시한다.

코드를 업로드하면 보드의 LED 매트릭스에 하트 모양이 표시되는 것을 확인할 수 있다.

[이미지: LED 매트릭스에 하트가 표시된 모습]

2) Wi-Fi로 LED 켜고 끄기 (웹서버)

우노 R4 WiFi를 공유기에 연결하고, 같은 네트워크의 스마트폰이나 PC 웹브라우저에서 보드의 내장 LED(D13)를 켜고 끄는 예제이다.

#include <WiFiS3.h>

char ssid[] = "공유기이름";
char pass[] = "비밀번호";

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);

  while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
    Serial.println("Wi-Fi 연결 중...");
    delay(3000);
  }
  server.begin();
  Serial.print("접속 주소: http://");
  Serial.println(WiFi.localIP());
}

void loop() {
  WiFiClient client = server.available();
  if (!client) return;

  String request = client.readStringUntil('\r');
  if (request.indexOf("GET /on") >= 0)  digitalWrite(LED_BUILTIN, HIGH);
  if (request.indexOf("GET /off") >= 0) digitalWrite(LED_BUILTIN, LOW);

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html; charset=utf-8");
  client.println("Connection: close");
  client.println();
  client.println("<h2>UNO R4 WiFi LED 제어</h2>");
  client.println("<a href=\"/on\">LED 켜기</a> | <a href=\"/off\">LED 끄기</a>");
  delay(10);
  client.stop();
}
  • 1 Line: 우노 R4 WiFi 전용 Wi-Fi 라이브러리인 WiFiS3를 포함한다.
  • 3~4 Line: 연결할 공유기의 이름(SSID)과 비밀번호를 입력한다. 우노 R4 WiFi는 2.4GHz 대역만 지원하므로 5GHz 전용 공유기에는 연결되지 않는다.
  • 6 Line: 80번 포트를 사용하는 웹서버 객체를 생성한다.
  • 12~15 Line: Wi-Fi 연결에 성공할 때까지 3초 간격으로 연결을 시도한다.
  • 16~18 Line: 웹서버를 시작하고, 공유기에서 할당받은 IP 주소를 시리얼 모니터에 출력한다.
  • 22~23 Line: 접속한 클라이언트(웹브라우저)가 없으면 loop()를 다시 시작한다.
  • 25~27 Line: 요청 주소에 /on이 있으면 LED를 켜고, /off가 있으면 LED를 끈다.
  • 29~34 Line: 웹브라우저에 LED 켜기/끄기 링크가 있는 간단한 HTML 페이지를 보낸다.
  • 36 Line: 응답을 보낸 후 연결을 종료한다.

코드를 업로드한 후 시리얼 모니터(115200bps)를 열면 다음과 같이 접속 주소가 출력된다. 같은 공유기에 연결된 스마트폰에서 이 주소로 접속하여 링크를 누르면 보드의 LED가 켜지고 꺼지는 것을 확인할 수 있다.

[이미지: 시리얼 모니터에 출력된 IP 주소와 스마트폰 접속 화면]


6. 주요 용도 및 주의사항

추천 주요 용도:

  • IoT 입문 프로젝트: 별도의 Wi-Fi 모듈 없이 온습도 모니터링, 원격 릴레이 제어, 웹서버 등을 바로 만들 수 있어 IoT 입문용으로 적합하다.
  • 기존 우노 프로젝트 업그레이드: 우노 R3로 만든 프로젝트에 무선 기능을 추가하거나 메모리 부족 문제를 해결할 때 보드만 교체하여 사용할 수 있다.
  • 교육용 보드: LED 매트릭스와 Qwiic 커넥터 덕분에 추가 부품 없이도 출력 결과를 바로 확인할 수 있어 수업용으로 유리하다.
  • USB HID 장치: 키보드나 마우스로 PC에 인식되므로 매크로 키패드 같은 입력장치를 만들 수 있다.

사용 시 주의사항:

  • 핀당 출력 전류 8mA: R3(20mA)보다 출력 전류가 크게 낮으므로 LED는 저항값을 높여 연결하고, 모터나 릴레이 코일 같은 부하는 반드시 트랜지스터나 드라이버 모듈을 거쳐 구동해야 한다.
  • Qwiic 커넥터는 3.3V 전용: 헤더의 I2C 핀(A4, A5)은 5V 로직이고 Qwiic 커넥터는 3.3V이므로, 센서의 동작 전압에 맞는 쪽을 사용해야 한다.
  • AVR 전용 코드 호환성: AVR 레지스터를 직접 다루는 코드나 일부 AVR 전용 라이브러리(예: 타이머 직접 제어)는 동작하지 않을 수 있으므로 라이브러리의 지원 보드를 확인해야 한다.
  • 2.4GHz Wi-Fi 전용: 5GHz 대역 Wi-Fi에는 연결할 수 없다.

구매좌표:

 

 

Arduino UNO R4 WIFI ABX00087 Renesas RA4M1 Development board imported from Italy New original authentic Italian import - AliExpr

Smarter Shopping, Better Living! Aliexpress.com

www.aliexpress.com

 

 

반응형
반응형

1. 아두이노 나노 R4 (Arduino Nano R4) 소개

기존 아두이노 나노(Nano R3 / Classic Nano)는 브레드보드에 직접 꽂아 쓸 수 있는 콤팩트한 크기와 우수한 접근성 덕분에 소형 시제품 개발이나 소형 로봇 제작에 널리 사용되어 온 보드이다. 하지만 8비트 ATmega328P 마이크로컨트롤러(MCU)를 탑재하고 있어 2KB에 불과한 SRAM 메모리와 16MHz 클럭의 한계로 인해, 복잡한 연산이나 고주파 신호 처리, 신형 센서 라이브러리 구동 시 메모리 부족 현상이 자주 발생했다.
**아두이노 나노 R4(Arduino Nano R4)**는 이러한 성능적 한계를 극복하기 위해 기존 나노의 소형 폼팩터(45 x 18 mm)를 유지하면서, 내부 핵심 두뇌를 32비트 Renesas RA4M1 (Arm Cortex-M4) 프로세서로 전면 교체한 최신 하이브리드 보드이다. 연산 속도와 메모리가 비약적으로 향상되었을 뿐만 아니라, 산업용 통신 규격인 CAN Bus, 정밀 12-bit DAC, 온보드 RGB LED, Qwiic I2C 커넥터 등 고급 주변장치가 대거 추가되었다.

2. 주요 사양 및 R3(기존 Nano)와의 비교

기존 8비트 기반 나노 R3와 32비트로 업그레이드된 신형 나노 R4의 핵심 사양 차이는 다음과 같다.

항목기존 아두이노 나노 (Nano R3)신형 아두이노 나노 R4 (Nano R4)

메인 MCU
ATmega328P (8-bit AVR)
Renesas RA4M1 (32-bit Arm® Cortex®-M4)
클럭 속도 (Clock)
16 MHz
48 MHz (3배 향상)
플래시 메모리 (Flash)
32 KB
256 KB (8배 확장)
SRAM (메모리)
2 KB
32 KB (16배 확장)
EEPROM
1 KB
8 KB
동작 전압 (Logic Voltage)
5V
5V (5V 로직 유지로 기존 센서 호환)
입력 전압 (VIN)
7 ~ 12 V
6 ~ 21 V (전원 허용범위 확대)
USB 커넥터
Mini-USB / Micro-USB
USB-C
신규 주변장치
없음
12-bit DAC, CAN Bus, Op-Amp, RTC, Qwiic, RGB LED
보드 형태
DIP 스루홀 핀전용
DIP 스루홀 + 캐슬레이티드(Castellated) SMD 납땜 지원

 


3. PIN 배열 및 새로운 주변장치(Peripheral) 특징

아두이노 나노 R4는 기존 나노 R3와 거의 동일한 핀 배치를 유지하여 빵판(Breadboard) 연결 호환성을 보장하면서도 내부에 강력한 부가 기능들을 새로 탑재했다.
1) 5V 로직 및 입출력 핀
  • 32비트 ARM 칩셋으로 변경되었음에도 동작 전압 5V를 그대로 유지한다. 따라서 기존 5V 센서나 모듈, 릴레이 등을 전압 변환기(Level Shifter) 없이 직접 연결할 수 있다.
  • 디지털 입출력 핀 14개, 아날로그 입력 핀 8개가 제공된다.
2) 정밀 12-bit DAC (A0 핀)
  • 기존 R3는 진짜 아날로그 전압 출력이 불가능하여 PWM(아날로그 시늉)만 가능했으나, 나노 R4는 A0 핀을 통해 **진짜 아날로그 가변 전압(12-bit DAC, 0~4095 단계)**을 출력할 수 있어 오디오 음원 합성 및 파형 생성에 유리하다.
3) Qwiic 커넥터 및 온보드 RGB LED
  • 보드 측면에 SparkFun 규격의 Qwiic I2C 커넥터가 기본 탑재되어 케이블 연결만으로 각종 I2C 센서를 납땜 없이 직렬 연결할 수 있다.
  • 시스템 상태를 직관적으로 표현할 수 있는 사용자 제어용 RGB LED가 내장되어 있어 별도 외장 LED 배선 없이도 다채로운 피드백을 구현할 수 있다.
4) 캐슬레이티드(Castellated) 모듈 설계
  • 보드 가장자리에 캐슬레이티드 홈이 파여 있어, 사용자가 제작한 맞춤형 메인 PCB 표면에 나노 R4 보드 자체를 직접 모듈 형태로 겉납땜(SMD Assembly)하여 양산 제품에 이식하기 쉽다.

4. 개발환경 준비 (Arduino IDE / PlatformIO)

아두이노 나노 R4는 기존 아두이노 IDE 및 VS Code 기반 PlatformIO 환경 모두에서 쉽게 설정하여 작성할 수 있다.
  1. 아두이노 IDE 2.0+ 설정:
    • 아두이노 IDE 실행 후 **[도구] → [보드] → [보드 매니저(Boards Manager)]**로 이동한다.
    • 검색창에 UNO R4 또는 Nano R4를 검색한 뒤, Arduino UNO R4 Boards 패키지를 설치한다. (나노 R4는 UNO R4 코어 라이브러리를 함께 공유한다.)
    • 보드 선택 메뉴에서 Arduino Nano R4를 선택하고 USB-C 포트로 연결한다.
  2. PlatformIO (VS Code) 설정:
    • platformio.ini 파일에 다음과 같이 보드 환경을 지정해 준다.
[env:nano_r4]
platform = renesas-ra
board = nano_r4
framework = arduino

5. 예제 코드: 온보드 RGB LED 제어 및 12-bit DAC 아날로그 전압 출력

다음 예제는 나노 R4의 온보드 RGB LED 색상을 변경함과 동시에 A0(DAC) 핀으로 정밀한 아날로그 전압 파형을 출력하는 기초 스케치 코드이다.
#define DAC_PIN A0

void setup() {
  // 1. DAC 출력 해상도를 12비트(0~4095)로 설정
  analogWriteResolution(12);
  
  // 2. 온보드 RGB LED 핀 출력 설정 (Nano R4 전용 핀 정의)
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
  
  // RGB LED 초기화 (High 전압 시 꺼짐)
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
}

void loop() {
  // [단계 1] RGB LED 빨간색 점등 & DAC 전압 상승 (0V -> 5V)
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  
  for (int val = 0; val <= 4095; val += 50) {
    analogWrite(DAC_PIN, val);  // 12-bit DAC 아날로그 전압 출력
    delay(1);
  }
  delay(300);

  // [단계 2] RGB LED 파란색 점등 & DAC 전압 하강 (5V -> 0V)
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, LOW);

  for (int val = 4095; val >= 0; val -= 50) {
    analogWrite(DAC_PIN, val);
    delay(1);
  }
  delay(300);
}
  • 1 Line: 12-bit DAC 전용 아날로그 출력 핀인 A0를 DAC_PIN으로 정의한다.
  • 5 Line: analogWriteResolution(12) 명령어를 사용하여 아날로그 출력 해상도를 기본 8비트(0255)에서 12비트(04095)로 끌어올린다.
  • 8~10 Line: Nano R4 보드에 내장된 RGB LED 제어용 핀(LEDR, LEDG, LEDB)을 출력 모드로 설정한다.
  • 21~24 Line: analogWrite(DAC_PIN, val)를 호출하여 A0 핀에 실제 0V부터 5V까지의 아날로그 가변 전압 신호를 생성해 출력한다.
  • 31~34 Line: 전압을 5V에서 0V로 단계적으로 낮추며 파형을 완성한다.

6. 주요 용도 및 주의사항

  1. 추천 주요 용도:
    • 고속 센서 데이터 처리 및 필터링: 48MHz 32비트 MCU와 32KB RAM 덕분에 DSP 연산이나 복잡한 센서 융합 알고리즘 처리에 적합하다.
    • 아날로그 음원/신호 생성기: 12-bit DAC를 활용하여 오디오 소리 합성이나 정밀 제어용 아날로그 전압 신호를 만들 수 있다.
    • CAN 통신 임베디드 장치: 자동차 및 산업용 현장 장비 통신(CAN Bus) 프로토타입 제작에 유용하다.
    • 양산형 소형 시제품: 캐슬레이티드 홈을 활용하여 자체 커스텀 PCB 보드에 모듈 형태로 직접 납땜 이식이 가능하다.
  2. 사용 시 주의사항:
    • 5V 동작 방식 유지: 32비트 ARM 칩셋이지만 5V 동작 전압을 사용하므로, 3.3V 전용 I2C 센서나 3.3V 전용 통신 모듈을 연결할 때는 전압 레벨에 주의하여 Qwiic 포트(3.3V 전용)를 활용하거나 레벨 시프터를 연결해야 한다.

구매좌표:

 

Original genuine Italian product Arduino Nano R4 Development board ABX00142 UNO REV3 NANO V3.0 R4 WIFI MINIMA - AliExpress 502

Smarter Shopping, Better Living! Aliexpress.com

www.aliexpress.com

 



반응형
반응형
1. 아두이노 UNO Q(우노 Q) 소개
기존 아두이노 우노(UNO)는 간편한 핀 제어와 접근성 덕분에 메이커들에게 가장 사랑받아 온 보드이지만, 8비트 내지 32비트 마이크로컨트롤러(MCU) 특성상 고화질 영상 처리나 인공지능(AI), 복잡한 네트워크 통신을 직접 수행하기에는 연산 성능의 한계가 명확했다. 그래서 비전 인식이나 머신러닝 처리는 라즈베리파이 같은 싱글보드 컴퓨터(SBC)에 맡기고, 모터나 센서 같은 정밀한 입출력 제어는 아두이노를 연결해 시리얼 통신으로 묶는 복잡한 구성을 사용하는 경우가 많았다.
**아두이노 UNO Q(Arduino UNO Q)**는 이러한 불편함을 해소하기 위해 퀄컴(Qualcomm)과 아두이노가 협력하여 개발한 하이브리드 보드이다. 즉, 풀 리눅스(Debian)와 엣지 AI를 돌리는 퀄컴 쿼드코어 AP와 정밀 실시간 핀 제어를 담당하는 STM32 MCU라는 **두 개의 두뇌(Dual-Brain)**를 전통적인 아두이노 우노 폼팩터 하나에 통합한 혁신적인 제품이다.

2. 주요 사양과 하드웨어 구성
외형은 기존 우노 보드 규격을 유지하면서도 내부는 라즈베리파이 4 수준의 연산력을 갖추고 있다. 주요 하드웨어 사양은 다음과 같다.
  • 메인 애플리케이션 프로세서 (MPU/SoC): Qualcomm Dragonwing™ QRB2210 (쿼드코어 Arm Cortex-A53 @ 최대 2.0 GHz)
  • GPU / AI 가속: Adreno 702 GPU (845 MHz, Vulkan/OpenCL 지원) 및 Hexagon QDSP6 v66 DSP 내장
  • 실시간 제어 마이크로컨트롤러 (MCU): STMicroelectronics STM32U585 (Arm Cortex-M33 @ 160 MHz, 2MB Flash, 786KB SRAM)
  • 메모리 / 저장장치: 2GB 또는 4GB LPDDR4X RAM / 16GB 또는 32GB 내장 eMMC (별도 SD카드 불필요)
  • 무선 통신: Wi-Fi 5 (듀얼밴드 2.4/5GHz) 및 Bluetooth 5.1 (온보드 안테나)
  • 디스플레이 및 입출력: 8×13 블루 LED 매트릭스(104개) 내장, USB-C (5V/3A 전원 입력 + DisplayPort Alt 모드 영상 출력 지원)
  • 인터페이스: Qwiic(I2C) 커넥터, 표준 우노 실드용 핀 헤더, 보드 후면 초고속 캐리어 커넥터(JMISC, JMEDIA)

3. PIN 배열 및 사용방법

아두이노 UNO Q의 전면 핀 배치는 기존 우노와 동일한 2.54mm 소켓 헤더 형태를 띠고 있어 겉보기에는 호환성이 높아 보이지만, 전기적 특성에서 치명적인 차이점이 있으므로 회로 연결 시 반드시 주의해야 한다.
1) 디지털 핀 (JDIGITAL)
  • D0에서 D13까지 14개의 핀이 제공되며, D3, D5, D6, D9, D10, D11 등 6개 핀에서 PWM 출력을 지원한다.
  • D0(RX), D1(TX)는 하드웨어 시리얼(UART)로 사용된다.
  •   로직 레벨 주의: 과거 우노 R3의 5V 로직이 아니라 3.3V 전압 레벨로 동작한다. 5V 전용 센서나 구형 5V 릴레이/실드를 레벨 시프터 없이 직결하면 STM32 MCU 핀이 파손될 수 있다.
2) 아날로그 핀 (JANALOG)
  • A0부터 A5까지 6개의 아날로그 입력핀이 제공된다.
  • 기존 우노의 10bit ADC(0~1023)와 달리 14bit 초정밀 ADC를 탑재하여 센서 값을 훨씬 미세하게 측정할 수 있다.
  • A0와 A1 핀은 내장 DAC 기능을 지원하므로 가변 전압을 아날로그 값으로 직접 출력할 수 있다.
3) Qwiic 커넥터
  • SparkFun 표준의 4핀 소형 커넥터로, 납땜이나 빵판 배선 없이 모듈식 I2C 센서나 아두이노 Modulino 시리즈를 케이블 하나로 줄줄이 직렬 연결(Daisy Chain)할 수 있다. (3.3V 전용)
4) JCTL 콘솔 포트
  • 시스템 부팅 로그 확인용 시리얼 콘솔 단자이다. 일반적인 3.3V나 5V USB-TTL 변환기를 연결하면 안 되며, 반드시 1.8V 로직을 지원하는 어댑터를 사용해야 한다.

4. 개발환경 준비와 아두이노 App Lab
아두이노 UNO Q는 개발 목적에 따라 두 가지 개발 방식을 선택할 수 있다.
  1. 아두이노 IDE 2.0+ (MCU 단독 모드):
    • 보드 매니저에서 Arduino UNO Q Core를 설치한 뒤, 평소 아두이노를 코딩하듯 C/C++ 스케치를 작성하여 업로드한다. 이 경우 STM32 MCU가 핀 입출력과 LED 매트릭스 제어를 전담한다.
  2. 아두이노 App Lab (하이브리드 모드):
    • 아두이노가 UNO Q와 함께 선보인 웹/PC 통합 개발 툴이다. 리눅스 측의 파이썬 AI 프로그램(미디어파이프, 컴퓨터 비전, 오디오 분류 등)과 STM32 측의 하드웨어 스케치를 '브릭(Bricks)'이라는 모듈형 블록으로 결합하여 단일 화면에서 동시에 제어할 수 있다.
  3. 독립 싱글보드 컴퓨터(SBC) 모드:
    • USB-C 허브를 통해 모니터(HDMI/DP)와 키보드, 마우스를 연결하면 데비안(Debian) 리눅스 데스크톱 PC로 단독 부팅되어 브라우징과 파이썬 코딩을 직접 수행할 수 있다.

5. 예제 코드: 리눅스-MCU 브릿지 통신 및 LED 제어
아두이노 UNO Q에서는 MPU(리눅스)와 MCU(STM32)가 내부적으로 고속 RPC(Remote Procedure Call) 브릿지로 연결되어 있다. 다음은 리눅스 파이썬에서 전송한 신호를 받아 아두이노 보드의 LED 매트릭스에 상태를 표시하는 기본 스케치 예제이다.
#include <Arduino_Bridge.h>
#include <Arduino_LED_Matrix.h>

Arduino_LED_Matrix matrix;

// 리눅스 측에서 호출할 원격 함수 정의
int setStatusDisplay(int code) {
  if (code == 1) {
    matrix.loadSequence(LEDMATRIX_ANIMATION_CHECK);
    matrix.play(true);
    return 1;
  } else {
    matrix.loadSequence(LEDMATRIX_ANIMATION_CROSS);
    matrix.play(true);
    return 0;
  }
}

void setup() {
  Bridge.begin();          // 리눅스 시스템과의 RPC 브릿지 통신 시작
  matrix.begin();          // 온보드 8x13 LED 매트릭스 초기화
  
  // 리눅스 Python에서 호출할 수 있도록 함수 등록
  Bridge.provide("setStatus", setStatusDisplay);
}

void loop() {
  Bridge.update();         // 브릿지 수신 메시지 처리
  delay(10);
}
  • 1~2 Line: 리눅스 연동용 Arduino_Bridge 라이브러리와 온보드 104개 LED 매트릭스를 다루는 Arduino_LED_Matrix 라이브러리를 포함한다.
  • 4 Line: LED 매트릭스 객체를 선언한다.
  • 7~17 Line: 리눅스에서 RPC로 넘겨준 숫자 코드값에 따라 매트릭스에 체크 표시나 X 표시 애니메이션을 띄우는 제어 함수를 작성한다.
  • 20 Line: Bridge.begin()을 통해 퀄컴 프로세서(리눅스)와 STM32 간의 데이터 통로를 개방한다.
  • 24 Line: 작성한 함수를 setStatus라는 이름의 원격 서비스로 등록하여, 리눅스 파이썬 스크립트에서 bridge.call("setStatus", 1) 형태로 바로 구동시킬 수 있도록 매핑한다.
  • 28 Line: 루프가 돌면서 리눅스로부터 들어오는 원격 요청 명령을 실시간으로 확인하고 갱신한다.

6. 주의사항
  1. 전압 레벨 준수: 디지털/아날로그 핀과 I2C Qwiic 포트는 전부 3.3V이다. 5V 신호를 직접 인가하면 보드가 즉시 망가지므로 양방향 로직 레벨 컨버터를 중간에 반드시 배치해야 한다.
  2. 전원 공급 용량: 퀄컴 쿼드코어 AP와 리눅스 OS가 구동되므로 일반 PC의 저전력 USB 포트로는 전원 부족으로 부팅 중 다운될 수 있다. 반드시 5V 3A(15W) 이상의 USB-PD 전원을 공급해 주어야 한다.
  3. 정상 전원 종료: 단순 MCU와 달리 eMMC에 데비안 리눅스 파일시스템이 작동 중이므로, 전원선을 그냥 뽑으면 저장장치 데이터가 손상될 수 있다. 온보드 전원 버튼을 눌러 정상 셧다운하거나 터미널에서 sudo poweroff 명령을 실행한 뒤 전원을 분리해야 한다.

구매좌표 : 

 

 

 

아두이노 우노 Q Arduino Uno Q 4GB (ABX00173) - CPU | 쿠팡

쿠팡에서 아두이노 우노 Q Arduino Uno Q 4GB (ABX00173) 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 CPU 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

 

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다

 

  1.  
  2.  
반응형

+ Recent posts