AP to PPPOS 프로젝트 이식하기 (Nano IoT Gateway)
ESP-IDF로 동작되는 Arduino Nano ESP32 보드에 기존에 작업한 AP to PPPOS 프로젝트를 이식해 보려고 합니다.
먼저 Nano ESP32 보드와 LTE CATM1 모뎀은 아래와 같이 Nano to UNO 확장보드와 아두이노 실드를 이용해서 연결되어 있습니다.
LTE CATM1 모뎀과 Nano ESP32 보드가 실제 연결된 라인은 아래와 같습니다.
우선, ESP-IDF는 아두이노와 다르게 GPIO번호를 사용하기 때문에 아래 Pinout의 내용을 숙지할 필요가 있습니다.
아두이노 핀번호와 맵핑되는 GPIO번호가 표시되어 있습니다.
LTE CATM1과 연결된 라인 중 개발자가 직접 다룰 수 있는 라인은 아래와 같이
Modem TX, Modem RX, Modem RESET과 연결된 세 개의 GPIO입니다.
GPIO번호는 동작코드에 적용할 예정이니 다시 한번 확인 부탁 드립니다.
이제 AP to PPPOS 빌드를 위해 아래 오픈소스 코드를 클론 해서 가져옵니다.
https://github.com/codezoo-ltd/esp-protocols
우측 상단 Code 버튼을 누르고 노란색으로 마킹한 부분의 주소를 복사버튼을 눌러서 가져옵니다.
git clone 합니다.
Visual Studio Code를 실행 후 File → Open Folder 실행해서 AP to pppos 예제를 선택합니다.
아래와 같은 순서로 작업을 진행합니다.
1. SDK 기본설정 파일 수정
EXPLORER 아래 sdkconfig.defaults 파일을 클릭합니다.
15번 라인부터 이전 글 (https://codezoo.tistory.com/84)에서 확인한 Nano ESP32 설정 값을 추가합니다.
[ 추가해야 할 설정값 ]
# Arduino Nano ESP32 board uses an ESP32-S3 chip
CONFIG_IDF_TARGET="esp32s3"
# 16 MB of QIO Flash:
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
# 8MB of OPI PSRAM:
CONFIG_SPIRAM=y
CONFIG_SPIRAM_MODE_OCT=y
CONFIG_SPIRAM_SPEED_80M=y
# 32kHZ crystal is used for RTC:
CONFIG_RTC_CLK_SRC_EXT_CRYS=y
# Console goes over USB Serial/JTAG peripheral:
CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y
입력을 마무리했으면 저장합니다. Ctrl + s 또는 File → Save 클릭합니다.
이제 보드를 연결하고 개발환경을 설정합니다. 이전 글(https://codezoo.tistory.com/84)의 개발환경 설정 내용을 참고합니다.
기존 프로젝트는 ESP32 IoT 보드 기준으로 구성되어 있으므로 Nano ESP32에서 동작할 수 있도록 수정하겠습니다.
1. 예제 코드 수정 ( main/ap_to_pppos.c )
보드 초기화 시 RESET 외에 사용할 핀이 없으므로 아래와 같이 수정합니다.
→ 기존
#define GPIO_OUTPUT_WAKEUP (gpio_num_t)GPIO_NUM_19
#define GPIO_OUTPUT_WAKEUP_PIN_SEL (1ULL<<GPIO_OUTPUT_WAKEUP)
#define GPIO_OUTPUT_RESET (gpio_num_t)GPIO_NUM_18
#define GPIO_OUTPUT_RESET_PIN_SEL (1ULL<<GPIO_OUTPUT_RESET)
#define GPIO_OUTPUT_PWRKEY (gpio_num_t)GPIO_NUM_5
#define GPIO_OUTPUT_PWRKEY_PIN_SEL (1ULL<<GPIO_OUTPUT_PWRKEY)
#define GPIO_OUTPUT_EXTANT (gpio_num_t)GPIO_NUM_4
#define GPIO_OUTPUT_EXTANT_PIN_SEL (1ULL<<GPIO_OUTPUT_EXTANT)
→ 수정
#define GPIO_OUTPUT_RESET (gpio_num_t)GPIO_NUM_5
#define GPIO_OUTPUT_RESET_PIN_SEL (1ULL<<GPIO_OUTPUT_RESET)
→ 기존
static void config_gpio(void)
{
gpio_config_t io_conf = {}; //zero-initialize the config structure.
io_conf.intr_type = GPIO_INTR_DISABLE; //disable interrupt
io_conf.mode = GPIO_MODE_OUTPUT; //set as output mode
io_conf.pin_bit_mask = (GPIO_OUTPUT_WAKEUP_PIN_SEL | GPIO_OUTPUT_RESET_PIN_SEL | GPIO_OUTPUT_PWRKEY_PIN_SEL | GPIO_OUTPUT_EXTANT_PIN_SEL);
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; //disable pull-down mode
io_conf.pull_up_en = GPIO_PULLUP_DISABLE; //disable pull-up mode
gpio_config(&io_conf); //configure GPIO with the given settings
}
→ 수정
static void config_gpio(void)
{
gpio_config_t io_conf = {}; //zero-initialize the config structure.
io_conf.intr_type = GPIO_INTR_DISABLE; //disable interrupt
io_conf.mode = GPIO_MODE_OUTPUT; //set as output mode
io_conf.pin_bit_mask = GPIO_OUTPUT_RESET_PIN_SEL;
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; //disable pull-down mode
io_conf.pull_up_en = GPIO_PULLUP_DISABLE; //disable pull-up mode
gpio_config(&io_conf); //configure GPIO with the given settings
}
→ 기존
static void gpio_modem(void)
{
/* Power on the modem */
ESP_LOGI(TAG, "Power on the modem");
gpio_set_level(GPIO_OUTPUT_WAKEUP, 1);
gpio_set_level(GPIO_OUTPUT_RESET, 0);
gpio_set_level(GPIO_OUTPUT_PWRKEY, 1);
gpio_set_level(GPIO_OUTPUT_EXTANT, 1);
vTaskDelay(pdMS_TO_TICKS(100));
gpio_set_level(GPIO_OUTPUT_RESET, 1);
vTaskDelay(pdMS_TO_TICKS(2000));
}
→ 수정
static void gpio_modem(void)
{
/* Power on the modem */
ESP_LOGI(TAG, "Power on the modem");
gpio_set_level(GPIO_OUTPUT_RESET, 0);
vTaskDelay(pdMS_TO_TICKS(100));
gpio_set_level(GPIO_OUTPUT_RESET, 1);
vTaskDelay(pdMS_TO_TICKS(2000));
}
2. 모뎀 UART 설정파일 수정 ( esp_modem_config.h )
esp_modem/include/esp_modem_config.h 파일 열기
→ 기존
#define ESP_MODEM_DTE_DEFAULT_CONFIG() \
{ \
.dte_buffer_size = 512, \
.task_stack_size = 4096, \
.task_priority = 5, \
.uart_config = { \
.port_num = UART_NUM_2, \
.data_bits = UART_DATA_8_BITS, \
.stop_bits = UART_STOP_BITS_1, \
.parity = UART_PARITY_DISABLE, \
.flow_control = ESP_MODEM_FLOW_CONTROL_NONE,\
.source_clk = ESP_MODEM_DEFAULT_UART_CLK, \
.baud_rate = 115200, \
.tx_io_num = 17, \
.rx_io_num = 16, \
.rts_io_num = GPIO_NUM_NC, \
.cts_io_num = GPIO_NUM_NC, \
.rx_buffer_size = 4096, \
.tx_buffer_size = 512, \
.event_queue_size = 30, \
}, \
}
typedef struct esp_modem_dte_config esp_modem_dte_config_t;
→ 수정
#define ESP_MODEM_DTE_DEFAULT_CONFIG() \
{ \
.dte_buffer_size = 512, \
.task_stack_size = 4096, \
.task_priority = 5, \
.uart_config = { \
.port_num = UART_NUM_2, \
.data_bits = UART_DATA_8_BITS, \
.stop_bits = UART_STOP_BITS_1, \
.parity = UART_PARITY_DISABLE, \
.flow_control = ESP_MODEM_FLOW_CONTROL_NONE,\
.source_clk = ESP_MODEM_DEFAULT_UART_CLK, \
.baud_rate = 115200, \
.tx_io_num = 43, \
.rx_io_num = 44, \
.rts_io_num = GPIO_NUM_NC, \
.cts_io_num = GPIO_NUM_NC, \
.rx_buffer_size = 4096, \
.tx_buffer_size = 512, \
.event_queue_size = 30, \
}, \
}
typedef struct esp_modem_dte_config esp_modem_dte_config_t;
1, 2 수정 완료 후 빌드 및 펌웨어 업로드를 진행합니다.
동작영상입니다.
Murata Type1SC 모듈 구매, 자료 관련 문의
(주)아성코리아
전지만 이사 010-5418-8812 mlcc@asung.com
박상인 수석 010-6556-5405 sipark@asung.com
LTE-CATM1 내장형 모뎀 구매 상담, 외주 개발, 협업 문의
(주)코드주
장병남 대표 010-8965-1323 rooney.jang@codezoo.co.kr