본문 바로가기

ESP32 Project

ESP32 Iridium 9603 모듈 위성통신

반응형

이 저장소는 아두이노 프레임워크를 사용하여 이리듐 9603 모듈을 ESP32와 연결하는 데 필요한 리소스를 제공합니다.

 

ESP32와 이리듐 9603 위성 모듈 간의 통신을 구축하고 원격 애플리케이션을 위한 글로벌 데이터 전송을 가능하게 하는 데 필요한 코드와 핵심 정보가 포함되어 있습니다. 

 

이 스케치는 링크 품질 확인, 네트워크 시간 조회, 메시지 전송, 위성 네트워크를 통한 수신 메시지 확인과 같은 기본 작업을 보여줍니다. 

 

깃 허브 소스 링크

 

 

개요

이 스케치는 이리듐 9603 모듈과 연동되도록 설계되어 위성 네트워크를 통한 글로벌 통신을 가능하게 합니다. 다음과 같은 기능을 포함합니다.

  • check9603linkquality : 이리듐 네트워크에서 링크 품질을 요청하고 반환합니다.
  • get9603time : 네트워크 시간을 요청하고 시리얼 모니터에 반환합니다.
  • send9603message : 사용자 지정 메시지(예: 센서 데이터)를 이리듐 네트워크로 전송합니다.
  • check9603recieve : 이리듐 네트워크에서 수신되는 메시지를 60초마다 확인합니다.

이 예제는 ESP32를 사용한다고 가정하지만, 시리얼 연결 방식을 조정하면 다른 플랫폼에도 적용할 수 있습니다.

설치 지침

하드웨어 요구 사항:

  1. ESP32 (또는 UART를 지원하는 호환 마이크로컨트롤러)
  2. 이리듐 9603 모듈 (유효한 이리듐 SIM 카드 포함)
  3. 배선 :
    • 이리듐 9603 TX  ESP32 RX (핀 25)
    • 이리듐 9603 수신  ESP32 송신 (핀 26)
    • 이리듐 9603 모듈에 적합한 전원 공급 장치(모듈 종류에 따라 일반적으로 3.6V~5V)를 사용하여 전원을 공급하십시오.
  4. 선택적으로, ESP32의 하드웨어 UART를 사용하지 않는 경우 다른 마이크로컨트롤러와의 통신을 위해 소프트웨어 시리얼 설정을 사용할 수 있습니다 (주석 참조).

도서관:

  • IridiumSBD이 라이브러리를 사용하면 이리듐 9603 모듈과 상호 작용하여 데이터를 송수신할 수 있습니다. 아두이노 IDE에 이 라이브러리가 설치되어 있는지 확인하십시오.
  • time.h날짜 및 시간 기능을 처리하기 위한 표준 시간 라이브러리입니다.

코드 분석:

  1. 핀 구성 :
    • TX  RX 핀은 ESP32가 이리듐 9603 모듈과 통신하기 위해 정의됩니다. 기본적으로 TX는 26번 핀 , RX는 25번 핀 입니다 .
  2. 초기화 :
    • 해당 IridiumSerial객체는 하드웨어 직렬 통신을 사용하여 19200bps의 속도로 이리듐 9603 모듈과 통신하도록 초기화되었습니다.
    • start9603(), check9603FWversion(), check9603linkquality(), 및 함수  get9603time()이리듐 모듈을 초기화하고 초기 검사를 수행합니다.
  3. 테스트 메시지 전송 :
    • 센서 데이터를 포함하는 테스트 메시지(JSON과 유사한 구조)가 정의되어 있습니다 TESTmessage. 이 메시지는 함수를 사용하여 이리듐 네트워크로 전송됩니다 send9603message().
  4. 메시지 수신 :
    •  check9603recieve()함수는 주기적으로 이리듐 네트워크에서 수신되는 메시지를 확인하고, 60초마다 결과를 시리얼 모니터에 기록합니다.

하드웨어 예시:

  • ESP32 : 내장 UART 기능을 갖춘 ESP32 보드를 사용할 수 있습니다. 이 보드는 듀얼 코어 프로세서, Wi-Fi 및 블루투스 기능을 갖추고 있어 위성 통신을 보완할 수 있는 강력한 옵션입니다.
  • 이리듐 9603 모듈 : 이리듐 9603 모듈은 원격 저대역폭 통신을 위해 설계되었습니다. 위성을 통해 작동하며, 휴대전화와 같은 다른 통신 수단을 사용할 수 없는 지역에서 사용할 수 있습니다.

사용 예시:

하드웨어 설정:

  1. 이리듐 9603 모듈의 TX  RX 핀을 ESP32의 해당 RX  TX 핀(핀 25 및 핀 26)에 연결합니다 .
  2. 이리듐 모듈을 적절한 전원(3.6V~5V)에 연결하십시오.
  3. 아두이노 IDE에 필요한 라이브러리를 설치하세요.
    • IridiumSBD
    • time.h

코드 업로드 중:

  1. 아두이노 IDE를 열고 ESP32 보드를 선택하세요.
  2. 제공된 코드를 새 스케치에 복사하세요.
  3. ESP32에 코드를 업로드하세요.

출력 모니터링:

  1. 아두이노 IDE에서 시리얼 모니터를 열어 시리얼 출력을 확인하세요.
  2. 이 모듈은 다음과 같은 기능을 수행합니다.
    • 이리듐 모듈의 링크 품질을 표시합니다.
    • 네트워크 시간을 표시합니다.
    • 네트워크에 테스트 메시지를 보냅니다.
    • 주기적으로 수신 메시지를 확인하세요.

추가 참고 사항:

  • 진단DIAGNOSTICS : 디버깅 모드를 활성화하고 문제 해결을 위해 자세한 로그를 출력하려면 해당 플래그를 활성화하십시오 .
  • 원활한 통신을 위해서는 이리듐 모듈에 활성 위성 구독이 설정되어 있는지 확인하십시오.

이 저장소는 이리듐 위성 통신을 활용하는 간단하지만 효과적인 방법을 소개하며, 사물 인터넷(IoT)이나 원격지에서의 원격 측정과 같은 더욱 복잡한 응용 분야로 확장할 수 있습니다.

 

 

ESP32_SatCom_Interfacing.ino

 

/*
 * Name: ESP32_SatCom_Interfacing
 * Version: 02
 * Author: Arshia Keshvari
 * Date: 15th of Febuary 2025
 * 
 * Description:
 * This sketch was written for an Arduino Uno originally where software serial is required
 * This sketch performs the following actions
 * 'check9603linkquality' Requests the link quality and returns on serial port
 * 'get9603time' Requests the network time and returns on serial port
 * 'send9603message' sends a message to the network in for form of a char*
 * 'check9603recieve' checks for messages on the network
 * loops checks for messages every 60 seconds.
 *
 */

#include <IridiumSBD.h>
#include <time.h>

#define TX 26 // ESP32 Microcontroller TX 
#define RX 25 // ESP32 Microcontroller RX

// #include <SoftwareSerial.h>
// const byte rxPin = 2;
// const byte txPin = 3;
// SoftwareSerial mySerial(rxPin, txPin);

//Setup Serial for ESP32
#include <HardwareSerial.h>
HardwareSerial IridiumSerial(1);

char* codeNAME = "Gatway_SatComs_Example";
char* codeVER = "03";

//Setup for Iridium module
#define DIAGNOSTICS false // Debug mode
//#define IridiumSerial mySerial
IridiumSBD modem(IridiumSerial);
char version[12];
int signalQuality = -1;
int err;
char* TESTmessage = "{'Sensor Report': {'last recording': [{'id': '123','position latitude': '17.66586','position longitude': '-156.18582','temperature_c': '12','humidity': '52','co2ppm': '10000','linkquality': '4','battery': '74','fwver': '03'},]}}";
uint8_t buffer[200] = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
struct tm t;
static bool messageSent = false;
size_t bufferSize = sizeof(buffer);

void setup()
{
  
  Serial.begin(115200);
  delay(2000); // Give time for Serial Monitor to start
  Serial.print("\nCode: " );
  Serial.println(codeNAME);
  Serial.print("Version: ");
  Serial.println(codeVER);
  Serial.print("\nSTARTUP...\n");
  // Initialize UART2 for Iridium communication
  IridiumSerial.begin(19200, SERIAL_8N1, RX, TX); // Set baud rate for Iridium module (19200) and use UART2
  //IridiumSerial.begin(19200);
  Serial.println("IridiumSerial initialized.");

  start9603();
  check9603FWversion();
  check9603linkquality();
  get9603time();
  send9603message(TESTmessage);
}

void loop()
{
  check9603recieve();
  Serial.print("No Messages... checking again in 60 seconds...\n");
  delay(60000);
 }

 

 

Irifium_function.ino

 

/*
 * Name: iridium_functions
 * Version: 02
 * Author: Arshia Keshvari
 * Date: 15th of Febuary 2025
 * 
 * Description:
 * This script holds the code for the following functions
 * 'check9603linkquality' Requests the link quality and returns on serial port
 * 'get9603time' Requests the network time and returns on serial port
 * 'send9603message' sends a message to the network in for form of a char*
 * 'check9603recieve' checks for messages on the network
 */

void start9603() {
  Serial.println("Starting modem...");

  err = modem.begin();
  Serial.print("Modem begin result: ");
  Serial.println(err);

  if (err != ISBD_SUCCESS) {
    Serial.print("Begin failed: error ");
    Serial.println(err);

    if (err == ISBD_NO_MODEM_DETECTED) {
      Serial.println("No modem detected: check wiring.");
    } else if (err == ISBD_SERIAL_FAILURE) {
      Serial.println("Serial failure: check connections.");
    } else if (err == ISBD_PROTOCOL_ERROR) {
      Serial.println("Protocol error: check AT commands.");
    } else {
      Serial.println("Modem initialization failed.");
    }

    return;
  }

  Serial.println("Modem initialized successfully.");
}



void check9603FWversion(){
  err = modem.getFirmwareVersion(version, sizeof(version));
  if (err != ISBD_SUCCESS){
     Serial.print("FirmwareVersion failed: error ");
     Serial.println(err);
     return;
  }
  Serial.print("Firmware Version is ");
  Serial.println(version);
}

void check9603linkquality(){
  err = modem.getSignalQuality(signalQuality);
  if (err != ISBD_SUCCESS){
    Serial.println(err);    
    Serial.print("SignalQuality failed: error ");
    return;
  }
  Serial.print("On a scale of 0 to 5, signal quality is currently ");
  Serial.print(signalQuality);
  Serial.print("(2 or higher prefered)\n");
}

void send9603message(char* message){
  Serial.print("Message ready to send is '");
  Serial.print(message);
  Serial.print("'\n");
  Serial.print("Trying to send the message.  This might take several minutes.\n");
  err = modem.sendSBDText(message);
  if (err != ISBD_SUCCESS){
    Serial.print("sendSBDText failed: error ");
    Serial.println(err);
    if (err == ISBD_SENDRECEIVE_TIMEOUT)
      Serial.print("Try again with a better view of the sky.\n");
  }
  else{
    Serial.print("Message '");
    Serial.print(message);
    Serial.print("' sent successfully...\n");
  }
}

void get9603time(){
  err = modem.getSystemTime(t);
  if (err == ISBD_SUCCESS)
   {
      char buf[32];
      sprintf(buf, "%d-%02d-%02d %02d:%02d:%02d",
         t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
      Serial.print("Iridium time/date is ");
      Serial.println(buf);
   }
   else if (err == ISBD_NO_NETWORK){
      Serial.println("No network detected.  Waiting 10 seconds.");
   }
   else {
      Serial.print("Unexpected error ");
      Serial.println(err);
      return;
   }
}

void check9603recieve(){
  err = modem.sendReceiveSBDText(NULL, buffer, bufferSize);    
  if (err != ISBD_SUCCESS){
      Serial.print("sendReceiveSBD* failed: error ");
      Serial.println(err);
    }
  else {
    messageSent = true;
    Serial.print("Inbound buffer size is ");
    Serial.println(bufferSize);
    for (int i=0; i<bufferSize; ++i){
      Serial.print(buffer[i], HEX);
      if (isprint(buffer[i])){
          Serial.print("(");
          Serial.write(buffer[i]);
          Serial.print(")");
        }
        Serial.print(" ");
      }
      Serial.println();
      Serial.print("Messages remaining to be retrieved: ");
      Serial.println(modem.getWaitingMessageCount());
    }
}

#if DIAGNOSTICS
void ISBDConsoleCallback(IridiumSBD *device, char c)
{
  Serial.write(c);
}

void ISBDDiagsCallback(IridiumSBD *device, char c)
{
  Serial.write(c);
}
#endif

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩