STM32 Nucleo-F401RE에 ESP8266을 붙이고, 라즈베리 파이를 AP(공유기) 로 켜서 ESP8266이 Pi의 Wi‑Fi에 접속·통신할 수 있게 하는 구성입니다.
| ESP8266 핀 | Nucleo-F401RE 핀 | 비고 |
|---|---|---|
| VBUS (5V) | 5V | 전원 (또는 3.3V 사용 시 3V3) |
| GND | GND | 공통 GND |
| TX | D2 (PA10) | Nucleo UART RX (ESP TX → PA10) |
| RX | D8 (PA9) | Nucleo UART TX (PA9 → ESP RX) |
[인터넷] ←랜선(eth0)→ [라즈베리 파이] ←Wi‑Fi AP(wlan0)→ [ESP8266] ←UART→ [STM32 Nucleo]
아래 두 가지 중 하나만 하면 됩니다.
RaspAP 설치
sudo apt update
sudo apt install -y raspap-webgui
설치 중 “Configure RaspAP”에서 Yes 선택 후, 필요하면 재부팅.
웹 설정
http://192.168.0.xxx).admin, 비밀번호 changeme (최초 로그인 후 반드시 변경).동작 확인
sudo apt update
sudo apt install -y hostapd dnsmasq
sudo systemctl stop hostapd
sudo systemctl stop dnsmasq
/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
다른 설정과 겹치지 않도록 기존 설정 백업 후, 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
/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 비밀번호 (원하는 값으로 변경).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
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 등으로 규칙 저장하는 것이 좋습니다.
SFEPS_AP)에 연결 → DHCP로 192.168.4.x 대역 IP 획득.192.168.4.1. 이 IP에서 TCP 서버(또는 UDP)를 열어 두면 됨.tmp_raspi_server/raspi_tcp_server (좌표/텍스트 전송, RTT 측정 지원)tmp_raspi_server 또는 기존 서버 코드에서 해당 포트 listen → STM32와 메시지 주고받기.예시 (Pi에서 테스트용 TCP 서버):
# 192.168.4.1:5555 에서 대기 (실제 서비스는 Python/C 등으로 구현)
nc -lk 5555
ESP8266/STM32는 192.168.4.1 포트 5555로 접속하면 됨.
| 항목 | 내용 |
|---|---|
| 연결 | 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 명령 또는 커스텀 프로토콜을 구현하면 됩니다.
stm에서 ESP8266에 전원이 공급되었을 때 주기적으로 connection을 검사하고 자동으로 Raspi에 연결될 수 있도록 구현했습니다.

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

라즈베리에서 입력한 값을 ESP에서 수신하여 STM monitoring 확인
모듈의 상태를 확인하고 통신 환경을 설정하는 기초 단계입니다.
| 명령어 | 설명 | 사용 예시 및 응답 |
|---|---|---|
AT | 통신 상태 확인 | AT → OK (연결 정상) |
AT+RST | 모듈 재시작 (Reset) | AT+RST → OK |
AT+GMR | 펌웨어 버전 확인 | AT+GMR → SDK/Bin 버전 출력 |
ATE0 / ATE1 | 에코 모드 끄기/켜기 | ATE0 (내가 보낸 명령어가 다시 안 보이게 함) |
AT+UART_DEF | 통신 속도(Baudrate) 영구 설정 | AT+UART_DEF=115200,8,1,0,3 |
드론이나 임베디드 장비를 네트워크에 붙일 때 필수적인 명령어입니다.
AT+CWMODE)연결 프로세스 예시
1. 모드 설정: AT+CWMODE=1
2. 주변 AP 검색: AT+CWLAP (주변 Wi-Fi 목록 출력)
3. 공유기 접속: AT+CWJAP="SSID","Password"
4. IP 주소 확인: AT+CIFSR → 모듈의 IP 출력
실제 서버와 데이터를 주고받는 핵심 과정입니다.
AT+CIPSTART="TCP","192.168.0.10",8080AT+CIPSEND=4 (4바이트를 보내겠다고 선언)Test (선언한 바이트만큼 입력) → SEND OK 응답AT+CIPCLOSE서버 모드로 동작하거나 여러 곳과 통신할 때 필요합니다.
AT+CIPMUX=1 (다중 연결 활성화)AT+CIPSERVER=1,80 (80번 포트로 서버 개설)보행자 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)의 주범이 바로 이 슬립 모드일 확률이 높음.
해결 방법
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/2 ≒ 9.8 ms
max 값이 240 → 48으로 확실히 줄어들었다 .