ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Arduino UNO-R4 Minima LTE FOTA 공개 합니다.
    FOTA 2026. 9. 4. 21:20

    얼마 전 ESP32/ESP32-S3에 CZ-ME310G1모뎀을 연결해서 LTE FOTA(Firmware Over-The-Air) example을 오픈소스로 공개했습니다. 

     

    ESP32/ESP32S3 LTE FOTA example upload

    CZ-ME310G1모뎀에 ESP32/ESP32S3 MCU를 사용해서 만든 제품을 원격으로 LTE망을 통해 업데이트할 수 있도록 FOTA(Firmware Over-The-Air) example을 업로드했습니다. 1. 펌웨어 업데이트 절차는 아래와 같습니다.업

    codezoo.tistory.com

     

    UNO-R4에도 FOTA를 제공하면 좋을것 같다는 의견이 있어서 관련 기술검토를 진행했습니다.

    ESP32/ESP32-S3에서 실시간 펌웨어가 비교적 손쉽게 구현할 수 있었던 이유는 아래와 같습니다.

     

    1. FOTA를 구현할 수 있게 넉넉한 내부 저장공간(플래시메모리)이 확보되어 있다.

    2. UPDATE API를 통해서 실시간으로 업데이트해도 문제가 없도록 부트로더와 라이브러리가 준비되어 있다.

    3. 하드웨어, 소프트웨어에서 무결성검증을 위한 방법도 제안하고 있어서 준비한 MD5SUM 값만 여기에 등록해 주면 알아서 무결성 체크까지 완료해 준다. 

     

    1,2,3이 모두 준비되어 있기 때문에 FTP와 연결해서 값만 잘 잘라서 가져오면 특별한 문제없이 FOTA를 구현할 수 있었습니다. 

     

    하지만 UNO-R4의 경우 1,2,3이 모두 준비되어 있지 않습니다. 

    1. 실시간으로 다운로드하여서 저장할 넉넉한 저장공간이 없습니다.

    2. FOTA에 대응할 수 있는 부트로더가 없습니다. USB로 아두이노 IDE와 연결해서 개발한 펌웨어만 올릴 수 있는 DFU(Device Firmware Update) 부트로더만 오픈소스로 공개되어 있습니다.

    3. 무결성을 검증할 방법도 준비되어 있지 않습니다. 

     

    3가지 문제를 해결해야 해서 여러 가지 방법들을 검토했습니다. 만들더라도 LTE 모뎀에 국한되지 않고 다른 곳에서도 사용할 수 있는 오픈소스 레퍼런스로 제작하려는 목적으로 만들었고 복잡하더라도 코드를 모두 공개하기로 마음먹었습니다. 

     

    1번 문제는 SPI Serial Flash를 별도로 연결했습니다. 

    W25Q16BVSIG Serial Flash Module

     

    16MBit(2MB) Flash 모듈입니다. SPI인터페이스로 연결할 수 있습니다. 

    WP(Write Protect)핀, HOLD핀을 별도로 제어하지 않기 때문에 신호가 흔들리지 않게 아래와 같이 VCC에 묶어서 Pull-Up 설정했습니다.  이 플래시메모리는 전원을 3.3V 공급해야 합니다. (주의!!)

     

    SPI통신하지만 UNO-R4의 SPI포트를 센서와 다른 장비들이 사용할 수 있으므로 SPI GPIO BitBang형태로 동작시켜서 사용합니다. (*SPI GPIO BitBang: GPIO를 Pull-Up, Pull-Down해서 SPI시그널 형태로 만들어서 동작시키는 방식. 속도는 느리지만 전용 SPI포트가 부족할 때 유용합니다.)

     

    SPI Serial Flash Memory와 Arduino UNO-R4 Minima는 아래와 같이 연결했습니다. CZ-ME310G1 모뎀은 Arduino Shield 액세서리에 연결해서 Minima 보드에 꼽았습니다. 

    SPI Serial Flash Arduino UNO-R4 Minima
    SPI Flash VCC 3.3V
    SPI Flash GND GND
    SPI Flash CS D4
    SPI Flash SCK D5
    SPI Flash MISO(DO) D6
    SPI Flash MOSI(DI) D7

     

    자 이제 하드웨어가 준비되었으면 순서대로 FOTA를 진행하겠습니다. 

     

    1. ME310G1 아두이노 라이브러러리 업데이트 (0.1.18 이상)

    LIBRARY MANAGER를 실행해서 me310g1을 검색해서 UPDATE 합니다. 0.1.18 이상 버전부터 지원합니다. 

    기존에 설치되어 있지 않으면 설치합니다.

     

    2. Examples --> ME310G1 --> UNO_R4 --> CZ_LTE_FOTA를 실행합니다. 

     

    3. CZ_LTE_FOTA example IDE화면이 보이면 File --> Save As... 를 선택합니다.

     

    원하는 위치에 저장합니다. 

     

    저장한 위치의 폴더를 열어보면 아래와 같이 3개 파일을 확인할 수 있습니다.

     

    3. 아두이노 보드의 부트로더를 업데이트합니다. 

    아래 내용을 참고해서 Renesas Flash Programmer에 새로운 프로젝트를 만들고 CZ_LTE_FOTA에 있는 dfu_minima.hex를 Add Files하고 Start버튼을 눌러서 부트로더를 업데이트합니다. 

     

    부트로더 업데이트 방법(필독)

     

    [Part2] Arduino FreeRTOS로 CZ-ME310G1모뎀 MQTT Example 실시간 처리하기

    시작하기 전에, UNO R4 보드(R4 Minima, R4 WiFi, NANO R4)로 Arduino FreeRTOS로 코드를 만들 때 태스크 스택 사이즈를 잘못 지정하거나 FreeRTOS에서 사용하는 메모리사이즈가 지정된 HeapSize를 넘어가서 Stack과

    codezoo.tistory.com

    부트로더 업데이트 후 우노보드 포트가 dfu로 잡힙니다. 아무 펌웨어나 한번 올려주시면 이전과 같이 포트가 잡힙니다. 

     

    4. 업데이트할 펌웨어 추출 방법은 아래 내용 참고 합니다. 컴파일 전 Arduino UNO R4 Minima로 보드설정이 되어 있는지 다시 한번 확인합니다. 

     

    업데이트 펌웨어 추출 방법(필독)

     

    ESP32/ESP32S3 LTE FOTA example upload

    CZ-ME310G1모뎀에 ESP32/ESP32S3 MCU를 사용해서 만든 제품을 원격으로 LTE망을 통해 업데이트할 수 있도록 FOTA(Firmware Over-The-Air) example을 업로드했습니다. 1. 펌웨어 업데이트 절차는 아래와 같습니다.업

    codezoo.tistory.com

     

    빌드한 bin파일을 CZ_LTE_FOTA 폴더로 가져와서 fw.bin으로 이름변경 합니다.

     

    CMD창을 실행하고 CZ_LTE_FOTA가 있는 탐색기 화면에서 아래와 같이 주소표시줄을 눌러서 나오는 경로를 복사하고(Ctrl+C)하고 CMD창에서 cd (Ctrl+V) 한 후 엔터키를 누릅니다. 

     

    이제 아래 명령어로 fw.bin.crc32파일을 만듭니다. python3가 미리 설치되어 있어야 합니다. 

    \>python3 make_crc32.py

     

    이제 만들어진 fw.bin, fw.bin.crc32 두 개 파일을 FTP서버에 업로드합니다.

    업로드 한 FTP 내부 경로 확인해 두시기 바랍니다. CZ_LTE_FOTA.ino 예제파일에서는 '/' 경로로 이동해서 그 안에 있는 fw.bin, fw.bin.crc32을 다운로드하여서 펌웨어 업데이트 합니다. 

     

    CZ_LTE_FOTA.ino 코드 중 아래 myME310.ftp_change_working_directory 함수에서 원하는 경로로 변경할 수 있습니다. 

    void performFOTA() {
      Serial.println("\n========== Starting FOTA Process ==========");
     
      myME310.ftp_close();
      delay(1000);

      myME310.debugMode(false);
      Serial.println("[FTP] Connecting to FTP server...");
      rc = myME310.ftp_open(FTP_ADDR_PORT, FTP_USER, FTP_PASS, 0, cID, ME310::TOUT_2MIN);

      if (rc == ME310::RETURN_VALID) {
        myME310.debugMode(true);
        delay(1000);
       
        rc = myME310.ftp_change_working_directory("/", ME310::TOUT_10SEC);

     

    FTP 연결을 위해 사용하시는 FTP서버의 주소:포트, 사용자 아이디, 사용자 패스워드를  입력하고 저장합니다.

    // FTP Configuration
    #define FTP_ADDR_PORT "ADDRESS:PORT" //"ftpsample.com:21"
    #define FTP_USER      "CLIENTUSER"
    #define FTP_PASS      "PASSWORD"
    #define APN "simplio.apn"

     

    이제 CZ_LTE_FOTA.ino 펌웨어를 빌드 & 업로드하면 FTP에 올라간 펌웨어를 다운로드 받아서 FOTA 작업을 진행합니다. 이후 변경된 펌웨어로 부팅됩니다. 

     

     

    이제 UNO-R4 Minima LTE FOTA를 구현한 펌웨어 구조를 살펴보겠습니다. 

    아래는 CZ_LTE_FOTA.ino 코드에 대한 내용입니다. 

     

    1) 아두이노앱이 실행되면 모뎀을 동작시키고 FTP서버에 접속해서 fw.bin.crc32 파일을 다운로드하여서 펌웨어 업데이트에 필요한 메타정보를 확보합니다. 메타정보는 업데이트 펌웨어의  CRC32값과 펌웨어 전체사이즈 입니다. 

     

    2) 1)의 정보가 정상적으로 확보되었는지 확인되면 모뎀에서 1024바이트 단위로 펌웨어를 다운로드 받아서 SPI Flash에 차곡차곡 저장합니다. 

     

    3) 전체 펌웨어 업데이트의 무결성을 체크하는 루틴인데, 2)가 완료된 후 진행하는 것이 아니라 2)를 진행하면서 메모리에 CRC32 값을 모아서 전체 펌웨어 쓰기 과정이 모두 끝난 뒤 메모리에 있는 값을 FTP서버에서 받은 CRC32 값과 비교하는 작업을 먼저하고 문제가 없으면 SPI Flash를 펌웨어 사이즈만큼 다시 읽어서 CRC32값을 구한뒤 FTP서버에서 받은 CRC32값과 다시 한번 비교합니다. 과정을 두 번 진행한 이유는 메모리에서 이상 없이 받았다고 해도 실제 SPI Flash 쓰면서 데이터가 손실되거나 오염될 수 있는 가능성이 있기 때문입니다. 

     

    4) 모든 무결성 검증과정이 마무리되면 SPI Flash 0번 섹터에 매직넘버와 업데이트상태(업데이트 펜딩), 펌웨어사이즈(새로운 펌웨어 사이즈), 펌웨어 CRC값 (새로운 펌웨어 CRC32 값)을 적고 우노보드를 재부팅합니다. 

     

    이제 부트로더를 통해 업데이트가 진행됩니다. 

     

    작업한 부트로더 코드는 코드주 깃에 공개되어 있습니다. 작업노트를 보시면 어떤 부분을 수정했고, 어떤 부분을 주의 깊게 살펴봐야 하는지 확인하실 수 있습니다. 

    https://github.com/codezoo-ltd/arduino-renesas-bootloader

     

    GitHub - codezoo-ltd/arduino-renesas-bootloader: A tinyusb based project implementing the bootloader for Uno R4 and Portenta C33

    A tinyusb based project implementing the bootloader for Uno R4 and Portenta C33 - codezoo-ltd/arduino-renesas-bootloader

    github.com

     

    부트로더 구조입니다. 

    기존에 사용하던 부트로더를 그대로 사용하면서 업데이트 기능도 같이 동작할 수 있게 만들기 위해서 작업했습니다. 

     

    부트로더 업데이트 기능을 요약하면

    1) SPI Flash 0번 섹터를 읽어서 업데이트할 펌웨어가 있는지 정보를 확인합니다. SPI Flash 장치가 없거나 0번 섹터에 내용이 없으면 기존 펌웨어로 부팅시킵니다. 

    2) 0번 섹터를 읽고 업데이트할 펌웨어 정보가 있으면 업데이트를 시작합니다. 업데이트 중 CRC32 체크를 통해 펌웨어 업데이트에 문제가 없는지 체크합니다. 

    3) 업데이트를 마친 후 CRC32 체크 결과까지 문제가 없으면 SPI Flash 0번 섹터를 지우고 리셋합니다.

    4) 0번 섹터에 내용이 없으므로 1) 과정을 통해 새로운 펌웨어로 부팅합니다. 

     

    부트로더에서 업데이트 중 정전이 되어 시스템이 재시작하거나 내부 플래시를 쓰던 중에 오류가 생겨서 CRC32 에러가 발생해서 리셋된 경우 0번 섹터가 살아있어서 2)의 과정부터 다시 실행됩니다.

     

    LTE FOTA에 사용했지만 이 부트로더를 활용해서 와이파이, 이더넷과 같은 다른 Connectivity와 연결해서 업데이트 환경을 구축하는데도 충분히 사용하실 수 있을 겁니다. 

     

    LTE 내장형 모뎀 대량 구매 상담, 하드웨어/펌웨어 외주 개발, 협업 문의, vodafone IoT유심 문의
    (주)코드주
    장병남 대표 010-8965-1323 rooney.jang@codezoo.co.kr

     

     

    코드주 LTE-CatM1 내장형 모뎀 CZ-ME310G1 / GNSS(GPS) 지원 / 외장 LTE 안테나 포함 / Zephyr 및 Arduino 지원

    메카솔루션 공식 쇼핑몰

    www.mechasolution.com

     

    CodeZoo LTE-CatM1 전용 아두이노 브레이크아웃 쉴드

    메카솔루션 공식 쇼핑몰

    mechasolution.com

     

    iot유심 : codezoo

    [codezoo] IoT Global SIM, IoT Connectivity, IoT Device

    smartstore.naver.com

     

    'FOTA' 카테고리의 다른 글

    ESP32/ESP32S3 LTE FOTA example upload  (0) 2026.08.10
Designed by Tistory.