함께 도전하고 만들어갑니다. ESP-IDF(esp_modem)
4. ESP32, LTE CATM1 모뎀으로 nano iot gateway 제작
: ESP32 WiFi SoftAP와 esp_modem을 결합해서 근거리의 와이파이 장치들을 연결하여 LTE CATM1 모뎀을 통해 외부 네트워크에 데이터를 송수신할 수 있도록 제작한 프로젝트입니다. 스마트폰 와이파이 테더링과 비슷하지만 ESP32를 사용해서 부팅이 훨씬 빠르고 가볍습니다.
https://codezoo.tistory.com/79
esp_modem을 활용한 오픈소스 프로젝트는 계속 늘려나갈 계획 입니다.
최근 LTE CATM1 모뎀을 사용하는 대구 개발자 분이 AWS IoT와 연결해서 실시간 환경데이터 모니터링 서비스와 환경 이상상태가 발생했을 때 외부에서 제어하는 목적의 서비스를 기획하고 계시다는 연락을 받았습니다.
그래서 위 2번 프로젝트(AWS IoT로 MQTT연동)를 추천해 드렸습니다.
아두이노 프로젝트와 차이점은 FreeRTOS로 소스코드가 구성되어 있어서 MQTT Report하는 태스크, 센서를 모니터링하는 태스크, 제어하기 위한 태스크들이 각각 동시에 동작하고 있고 FreeRTOS스케쥴러에 의해 적절하게 동작할 수 있도록 소스코드를 손봐줘야 하는 이슈가 있습니다. 기술적인 난이도 때문에 RTOS를 처음 접하는 개발자에게 까다로운 부분도 있을 거라 생각했습니다.
프로젝트를 추천해 드린지 몇일 지나지 않아 주말에 메일을 통해 영상을 하나 제공받았습니다.
ESP32+LTE CATM1모뎀에 온도, Water Level, RS485(Modbus), Relay센서를 연결해서 보드를 구성했고 여기에 AWS IoT 서비스와 연동 및 WebUI를 통한 제어까지 모두 구현해서 저에게 보내주셨습니다.
코드주에서 제공한 예제가 잘 되어 있어서 빠르게 구현했다고 말씀 하셨지만, 며칠간 상당한 열정과 집중력을 발휘하지 않으셨다면 절대 구현되지 않을 거라는 걸 아는지라 정말 잘하셨다고 메일로 회신드렸습니다. 제공한 솔루션을 통해 새로운 것들이 만들어지는 것을 보는 것은 오픈소스 개발자의 큰 기쁨이자 보람입니다. ^^ 열정을 일깨워 주셔서 진심으로 감사드립니다.
오픈소스를 공개하면서 안테나 설정에 대한 주석을 빼고 코드를 오픈 했는데, 이번 기회에 다시 한번 정리했습니다.
esp_modem을 사용하는 프로젝트 AP to pppos, AWS IoT, FireBase, TLSMQTT,,, 에서 사용하는 초기화 코드 중에서
안테나 설정하는 코드가 있습니다.
아래 굵은 글씨로 표시한 부분 입니다.
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 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));
}
그중에서,
gpio_set_level(GPIO_OUTPUT_EXTANT, 1);
코드는 외부 안테나를 사용(Enable)한다는 의미입니다.
내장안테나를 사용하면서 위 코드를 사용할 경우 안테나의 이득(Gain)을 획득할 수 없기 때문에
송수신 감도가 나빠져서 정상적으로 통신이 되지 않습니다.
따라서 내장안테나를 사용하시는 경우,
gpio_set_level(GPIO_OUTPUT_EXTANT, 0);
로 코드를 수정해야 합니다.
만약 아래 사진처럼 외장안테나가 연결 된 상태라면,
gpio_set_level(GPIO_OUTPUT_EXTANT, 1);
이렇게 설정해서 사용 합니다.
외장, 내장안테나 사용 시 꼭 참고하시기 바랍니다.
감사합니다.
외장안테나 사용시 코드
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_WAKEUP, 1);
gpio_set_level(GPIO_OUTPUT_RESET, 0);
gpio_set_level(GPIO_OUTPUT_PWRKEY, 1);
gpio_set_level(GPIO_OUTPUT_EXTANT, 0);
vTaskDelay(pdMS_TO_TICKS(100));
gpio_set_level(GPIO_OUTPUT_RESET, 1);
vTaskDelay(pdMS_TO_TICKS(2000));
}
오픈소스를 개발하시면서 막히시는 부분이 있으시거나 자랑하실 것이 있으시면 언제든지 LTE CATM1 개발자 게시판을 이용해 주세요. 여러분을 기다리겠습니다.
LTE CATM1 개발자 게시판 : https://bit.ly/3FFuBwW
함께 도전하며 만들어 갑시다~
Murata Type1SC 모듈 구매, 자료 관련 문의
(주)아성코리아
전지만 이사 010-5418-8812 mlcc@asung.com
박상인 수석 010-6556-5405 sipark@asung.com
LTE-CATM1 내장형 모뎀 구매 상담, 외주 개발, 협업 문의
(주)코드주
장병남 대표 010-8965-1323 rooney.jang@codezoo.co.kr