ESP8266 and STM32F4

  • Post author:
  • Post category:STM32

출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=simonsayz&logNo=220724527073

ESP8266  –  The Wrong Solution or Good…

요즘 많이 사용하는 ESP8266을 고속 통신이 필요해서 테스트를 해보았습니다.

인터넷 상에서, 너무 좋은 정보들이 많이 있기는 한데, 개인적으로 정말 필요했던, ESP8266 (ESP12, WROOM02)의 물리적인 속도는 어디까지 나오는가에 대한 정보를 찾을 수가 없었습니다.

그래서 직접 TCP/IP 성능을 직접 확인하기로 하고, 각종 테스트를 진행해보았습니다.

상황 , 전제조건

– 개인 프로젝트용으로 초당 1MB/s ​속도로 스트리밍이 되어야 함.

– STM32F4의 통신 모듈로 사용해야 함.

– 인터넷에 있는 내용은 전체가 그런것은 아니지만, 주객전도된 내용이 많음.
(16Mhz Atmega가 80,160Mhz ESP8266을 통신 모듈로 사용해서,  배보다 배꼽이 더 큼.

Atmega가 나쁘다는 것이 아니고, ESP8266 성능이 상대적으로 너무 뛰어남. 접근성에서 Atmega가 좋은 것은 인정)

– STM32F4는 두가지 모드로 작동(On-Air , Disk저장, 저장 장치는 SDCard사용- SDIO I/F)

주의

bps = bit / sec ,   Bps = byte /sec

실험 결과

– AT Command 방식으로는 해결 않됨. (성능을 향상하기 위해서, Firmware 직접 작성 필수)

 – ESP8266ex는 160Mhz 클럭사용해야 함.

 –  시스템 성능테스트를 위해서, PC를 사용할 경우, FT232BM 대신, 빠른 USB-Uart 컨버터 사용해야함.
(  PC상에서 Packet을 Push해서 ESP8266이 Crash되지 않도록 작성해야함)

 – STM32F4 (168Mhz) 사용할 경우, UART는 10.5Mbps까지 가능 (USART1,6사용시), 나머지 Uart,Usart는 5.25Mbps까지 가능

 – ESP8266 Uart는 9Mbps까지는 가능

    ( PC로 테스트하기 위해서는 PL2303HXD를 사용해야 함, FT232BM 사용시 장비 최고 속도 미만인 관계로, 테스트 불가)

–  ESP8266 단독 실행시 1.4MB/s 정도까지 전송속도가 보장됨 (잘 작성했을 경우)

–  STM32F4의 경우, USART를 사용해도 연동시 7Mbps정도만 가능 (보드에 따라서 성능차이 발생함)

Resampling x8 사용시, x16 사용시 5Mbps까지 가능

– 고속 연동을 위해서는 SPI를 사용해야함.

SPI 통신의 문제점을 해결하기 위해서, Uart도 사용해야 함.  (Master : ESP8266 / Slave : STM32F4 )

잘 작성을 한다면, SPI만으로도 가능하지만, 응답을 받는 ESP8266 CPU 낭비를 없애기 위해서

기본 구성도는 …​

PC(Mobile) -> Wifi -> ESP8266 -> SPI -> STM32 (Receive)

Uart <- STM32 (Send)

– ESP8266 코드 작성시, 프로토콜의 특성상, TCP<->Uart Transparent Bridge 예제와 같이 작성하면 망함.

(TCP/IP Nagle때문에, 비대칭 송수신 통신일 경우, 패킷을 모아주어야 함, 특히 무선인터넷에서는 잘못 작성할 경우, 10배정도 차이가

발생할 수도 있음.  응답은 한개의 패킷으로  / 개인 프로젝트에서 비대칭 (PC->Embedded System (패킷多),

Embedded System->PC(패킷小) )

 

최종 결론 (/w STM32F4)

– 1MBps가 요즘 장비(예. 단말기 – 휴대폰)에서는 저속이나, Embedded 장비에서는 매우 고속임 (bit로 환산할 경우, 10Mbps)

(cf. 115200bps ~= 11520Bps =  11.5KBps)

– 고속 통신을 하려면, Interrupt 방식은 Cortex M4라도 절대 사용하면 않됨

(모두 DMA방식을 사용해야함)

– SDIO는 DMA Stream,Channel이 고정되어 있으므로, DMA 매핑을 할때 0순위로 선정되어야 함.

– DMA 방식으로 적당히 작성시, 100KBps정도까지 가능

– Optimized State Machine으로 작성할 경우, 500KB까지 가능

(손발이 오그라질때까지 최적화를 할 경우, 900KB까지 가능할 것으로 예상)

– Display에서는 FPS, RPS가 구별되어야 함

RPS (Refresh Rate / Sec) : 초당 화면 갱신율 (H/W적으로 업데이트 가능한)

FPS (Frame Rate/ Sec) : 초당 화면 전환 (S/W적으로 — 일반적인 용도)

컨텐츠를 플레이하지 않을 경우, 순수 화면 갱신율을 RPS로 정의해야 함. (예. 숫자만 출력되게 한다면, 1000 RPS가 될 수도 있음)

컨텐츠를 플레이할 경우에는 시스템 전반적인 성능으로 화면이 전환됨. (60FPS, 1200RPS라고 한다면, 1화면이 20면 반복출력되는 것임)

RPS와 FPS는 서로 Sync가 맞아야 함. FPS시간이 RPS사이에 끼어들면, 화면에 줄이가는 현상이 보여짐

특히 전광판같이 1/4,1/8,1/16 Duty를 갖는 경우, 카메라로 찍으면 눈으로 보이는 것과는 다르게 몇개의 줄만 나오는 것을

확인 할 수 있음 (방송용 카메라에서 고속 프레임으로 찍을 경우 발생, 이 현상을 방지하기 위해서는 1000RPS이상을 지원해야 함.

일반적 검증을 위해서는 iOS AVCamManual 같은 예제를 컴파일해서 설치한 후, Exposure(노출)에서 ISO나 Duration조정을

해보면 됨/ 또한 컬러 LED전광판의 경우, 고속 제어를 할 경우, Ghost Effect가 발생을 함(잔류 전류가 다른 LED를 키는 현상)

이런 부분은 bypass할 수 있는 저항을 달거나 신형 드라이버를 사용하거나, S/W적으로 역계산 함으로 해결 가능함)

발상의 전환

LED를 센서로 사용할수도 있음 (검색어 : LED as Light Sensor , LEDs to Detect Light)

느낌점

– 하드웨어가 $2이라도, $1000 소프트웨어가 붙어서, $10000 제품이 될 수도 있음.

정말 공개 소프트웨어 개발자분들을 존경해야 함.

참고. UART 통신 속도