NucleoF401re-ESP8266 wifi communication

최진철·2026년 3월 2일

Embedded 📲

목록 보기
4/4
post-thumbnail

ESP8266 ↔ STM32 ↔ Pi 통신

라즈베리 파이 AP 모드 설정

STM32 Nucleo-F401RE에 ESP8266을 붙이고, 라즈베리 파이를 AP(공유기) 로 켜서 ESP8266이 Pi의 Wi‑Fi에 접속·통신할 수 있게 하는 구성입니다.


1. 연결 개요

1.1 ESP8266 ↔ Nucleo-F401RE

ESP8266 핀Nucleo-F401RE 핀비고
VBUS (5V)5V전원 (또는 3.3V 사용 시 3V3)
GNDGND공통 GND
TXD2 (PA10)Nucleo UART RX (ESP TX → PA10)
RXD8 (PA9)Nucleo UART TX (PA9 → ESP RX)
  • Nucleo 기준: PA9 = USART1_TX, PA10 = USART1_RX (STM32 UART1 사용).
  • ESP8266은 3.3V 논리이므로, Nucleo(3.3V)와 직접 연결 가능. 5V 전원만 쓰고 신호선은 3.3V 유지.

1.2 네트워크 구조

[인터넷] ←랜선(eth0)→ [라즈베리 파이] ←Wi‑Fi AP(wlan0)→ [ESP8266] ←UART→ [STM32 Nucleo]
  • 라즈베리 파이: 랜선(eth0)으로 외부 인터넷, wlan0를 AP로 켜서 ESP8266/STM32가 접속.
  • ESP8266: Pi가 만든 AP에 Wi‑Fi로 연결 후, Pi 위에서 도는 TCP 서버 등과 통신.

2. 라즈베리 파이 AP 모드 구성

아래 두 가지 중 하나만 하면 됩니다.


방법 A: RaspAP으로 빠르게 구성 (권장)

  1. RaspAP 설치

    sudo apt update
    sudo apt install -y raspap-webgui

    설치 중 “Configure RaspAP”에서 Yes 선택 후, 필요하면 재부팅.

  2. 웹 설정

    • Pi의 eth0 IP로 브라우저 접속 (예: http://192.168.0.xxx).
    • 로그인: 계정 admin, 비밀번호 changeme (최초 로그인 후 반드시 변경).
    • WiFiEnable AP 켜기.
    • SSID, 비밀번호(WPA) 설정 후 저장.
  3. 동작 확인

    • 스마트폰/PC로 해당 SSID 검색 후 연결해 보기.
    • ESP8266도 이 SSID/비밀번호로 연결하면 됨.

방법 B: hostapd + dnsmasq 로 수동 구성

2.1 패키지 설치

sudo apt update
sudo apt install -y hostapd dnsmasq
sudo systemctl stop hostapd
sudo systemctl stop dnsmasq

2.2 고정 IP (wlan0, AP용)

/etc/dhcpcd.conf 끝에 추가:

# AP용 wlan0 고정 IP (eth0는 기존대로 랜선 DHCP 유지)
interface wlan0
    static ip_address=192.168.4.1/24
    nohook wpa_supplicant

적용:

sudo systemctl restart dhcpcd

2.3 dnsmasq (AP 클라이언트에게 IP 배포)

다른 설정과 겹치지 않도록 기존 설정 백업 후, AP 전용 설정만 사용:

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak

/etc/dnsmasq.conf 새로 만들기:

interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
domain=local
address=/raspi.local/192.168.4.1

2.4 hostapd (AP 설정)

/etc/hostapd/hostapd.conf:

interface=wlan0
driver=nl80211
ssid=SFEPS_AP
hw_mode=g
channel=6
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=your_password_here
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
  • ssid: ESP8266/STM32가 접속할 AP 이름.
  • wpa_passphrase: AP 비밀번호 (원하는 값으로 변경).
    -> 최소 8자리 이상으로 설정해야한다 .!!

hostapd가 이 파일을 쓰도록:

sudo bash -c 'echo DAEMON_CONF=\"/etc/hostapd/hostapd.conf\" >> /etc/default/hostapd'
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd
sudo systemctl start dnsmasq

2.5 IP 포워딩 (선택, AP 클라이언트가 인터넷 쓰게 할 때)

AP 클라이언트(ESP8266 등)가 Pi를 통해 인터넷에 나가게 하려면:

sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

재부팅 후에도 유지하려면 iptables-persistent 등으로 규칙 저장하는 것이 좋습니다.


3. 통신 흐름 (ESP8266 ↔ Pi ↔ STM32)

  1. ESP8266: Pi의 AP(예: SFEPS_AP)에 연결 → DHCP로 192.168.4.x 대역 IP 획득.
  2. Pi: AP의 게이트웨이 = 192.168.4.1. 이 IP에서 TCP 서버(또는 UDP)를 열어 두면 됨.
    • 예: tmp_raspi_server/raspi_tcp_server (좌표/텍스트 전송, RTT 측정 지원)
  3. STM32: UART로 ESP8266에 AT 명령 또는 펌웨어에서 정의한 프로토콜로 “Pi의 192.168.4.1:포트”로 접속하라고 지시.
  4. Pi 서버: tmp_raspi_server 또는 기존 서버 코드에서 해당 포트 listen → STM32와 메시지 주고받기.

예시 (Pi에서 테스트용 TCP 서버):

# 192.168.4.1:5555 에서 대기 (실제 서비스는 Python/C 등으로 구현)
nc -lk 5555

ESP8266/STM32는 192.168.4.1 포트 5555로 접속하면 됨.


4. 정리

항목내용
연결ESP8266 TX→PA10(RX), RX→PA9(TX), GND, 5V(또는 3V3)
Pi 역할랜선(eth0)=인터넷, wlan0=AP로 ESP8266/STM32 접속 허용 + TCP 서버 구동(raspi_tcp_server)
AP 구성RaspAP(방법 A) 또는 hostapd+dnsmasq(방법 B)
통신ESP8266이 Pi AP에 접속 → Pi의 192.168.4.1:원하는포트 로 TCP/UDP

이후 STM32 쪽에서는 USART1(PA9/PA10)로 ESP8266 AT 명령 또는 커스텀 프로토콜을 구현하면 됩니다.


실제 test 확인

stm에서 ESP8266에 전원이 공급되었을 때 주기적으로 connection을 검사하고 자동으로 Raspi에 연결될 수 있도록 구현했습니다.

stm ↔ Raspi wifi commuication

AT 펌웨어 내 연결 설정 확인 .

stm 내에서 bsp 값을 받아서 인식 완료.


라즈베리에서 입력한 값을 ESP에서 수신하여 STM monitoring 확인


AT 펌웨어 명령어

1. 기본 및 설정 명령어

모듈의 상태를 확인하고 통신 환경을 설정하는 기초 단계입니다.

명령어설명사용 예시 및 응답
AT통신 상태 확인ATOK (연결 정상)
AT+RST모듈 재시작 (Reset)AT+RSTOK
AT+GMR펌웨어 버전 확인AT+GMR → SDK/Bin 버전 출력
ATE0 / ATE1에코 모드 끄기/켜기ATE0 (내가 보낸 명령어가 다시 안 보이게 함)
AT+UART_DEF통신 속도(Baudrate) 영구 설정AT+UART_DEF=115200,8,1,0,3

2. Wi-Fi 연결 관련 명령어

드론이나 임베디드 장비를 네트워크에 붙일 때 필수적인 명령어입니다.

  • 모드 설정 (AT+CWMODE)
    • 1: Station 모드 (공유기에 접속)
    • 2: SoftAP 모드 (스스로 공유기가 됨)
    • 3: Station + SoftAP 혼합

연결 프로세스 예시
1. 모드 설정: AT+CWMODE=1
2. 주변 AP 검색: AT+CWLAP (주변 Wi-Fi 목록 출력)
3. 공유기 접속: AT+CWJAP="SSID","Password"
4. IP 주소 확인: AT+CIFSR → 모듈의 IP 출력


3. TCP/UDP 통신 명령어 (데이터 송수신)

실제 서버와 데이터를 주고받는 핵심 과정입니다.

Single Connection (단일 연결) 예시
  1. 서버 연결 (TCP): AT+CIPSTART="TCP","192.168.0.10",8080
  2. 데이터 송신 준비: AT+CIPSEND=4 (4바이트를 보내겠다고 선언)
  3. 데이터 입력: Test (선언한 바이트만큼 입력) → SEND OK 응답
  4. 연결 종료: AT+CIPCLOSE
Multiple Connection (다중 연결 설정)

서버 모드로 동작하거나 여러 곳과 통신할 때 필요합니다.

  • AT+CIPMUX=1 (다중 연결 활성화)
  • AT+CIPSERVER=1,80 (80번 포트로 서버 개설)

rtt 시간 측정

보행자 tracking을 위한 지연율을 확인하기 위해 RTT를 측정해본 결과 문제사항을 발견할 수 있었습니다.

[TCP] 클라이언트 연결 대기 중...
[TCP] Client connected from 192.168.4.18:5853
[RTT] ---- PING/PONG RTT 테스트 시작 ----
[RTT] count=20, interval=200 ms
[RTT] seq=1 rtt=70 ms | line="PONG,1"
[RTT] seq=2 rtt=97 ms | line="PONG,2"
[RTT] seq=3 rtt=223 ms | line="PONG,3"
[RTT] seq=4 rtt=197 ms | line="PONG,4"
[RTT] seq=5 rtt=208 ms | line="PONG,5"
[RTT] seq=6 rtt=240 ms | line="PONG,6"
[RTT] seq=7 rtt=13 ms | line="PONG,7"
[RTT] seq=8 rtt=22 ms | line="PONG,8"
[RTT] seq=9 rtt=11 ms | line="PONG,9"
[RTT] seq=10 rtt=12 ms | line="PONG,10"
[RTT] seq=11 rtt=17 ms | line="PONG,11"
[RTT] seq=12 rtt=12 ms | line="PONG,12"
[RTT] seq=13 rtt=29 ms | line="PONG,13"
[RTT] seq=14 rtt=12 ms | line="PONG,14"
[RTT] seq=15 rtt=11 ms | line="PONG,15"
[RTT] seq=16 rtt=15 ms | line="PONG,16"
[RTT] seq=17 rtt=34 ms | line="PONG,17"
[RTT] seq=18 rtt=23 ms | line="PONG,18"
[RTT] seq=19 rtt=14 ms | line="PONG,19"
[RTT] seq=20 rtt=27 ms | line="PONG,20"
[RTT] ---- 완료 ----
[RTT] count=20, avg=64.35 ms, min=11 ms, max=240 ms
[RTT] 대략적인 편도 지연 ≈ avg/2 ≒ 32.175 ms

RTT 결과에서 값이 갑자기 240ms까지 튀는 현상(Jitter)의 주범이 바로 이 슬립 모드일 확률이 높음.

  • 반응 속도 저하: 데이터가 들어올 때 잠들어 있던 모뎀이 깨어나기까지 수십에서 수백 밀리초(ms)
  • 패킷 유실 위험: 모뎀이 깨어나는 동안 들어온 데이터 패킷이 버퍼에서 밀리거나 유실될 수 있음 .
  • 연결 불안정: 라즈베리 파이 AP와의 연결을 유지하기 위한 비콘(Beacon) 신호를 놓쳐 연결이 아예 끊어지는 원인이 될 수 있다 .

해결 방법

AT+SLEEP=0
//모든 슬립 모드를 비활성화

Result

[TCP] Client connected from 192.168.4.18:18443
[RTT] ---- PING/PONG RTT 테스트 시작 ----
[RTT] count=20, interval=200 ms
[RTT] seq=1 rtt=11 ms | line="PONG,1"
[RTT] seq=2 rtt=14 ms | line="PONG,2"
[RTT] seq=3 rtt=12 ms | line="PONG,3"
[RTT] seq=4 rtt=11 ms | line="PONG,4"
[RTT] seq=5 rtt=12 ms | line="PONG,5"
[RTT] seq=6 rtt=14 ms | line="PONG,6"
[RTT] seq=7 rtt=48 ms | line="PONG,7"
[RTT] seq=8 rtt=38 ms | line="PONG,8"
[RTT] seq=9 rtt=18 ms | line="PONG,9"
[RTT] seq=10 rtt=12 ms | line="PONG,10"
[RTT] seq=11 rtt=13 ms | line="PONG,11"
[RTT] seq=12 rtt=27 ms | line="PONG,12"
[RTT] seq=13 rtt=30 ms | line="PONG,13"
[RTT] seq=14 rtt=20 ms | line="PONG,14"
[RTT] seq=15 rtt=11 ms | line="PONG,15"
[RTT] seq=16 rtt=25 ms | line="PONG,16"
[RTT] seq=17 rtt=13 ms | line="PONG,17"
[RTT] seq=18 rtt=34 ms | line="PONG,18"
[RTT] seq=19 rtt=17 ms | line="PONG,19"
[RTT] seq=20 rtt=12 ms | line="PONG,20"
[RTT] ---- 완료 ----
[RTT] count=20, avg=19.6 ms, min=11 ms, max=48 ms
[RTT] 대략적인 편도 지연 ≈ avg/29.8 ms

max 값이 240 → 48으로 확실히 줄어들었다 .

profile
세상의 어려운 문제를 해결하자

0개의 댓글