피지컬 컴퓨팅을 활용한 캔위성 제작 및 발사 모의

Hgkim5241 (토론 | 기여)님의 2024년 8월 6일 (화) 08:16 판

캔위성 프로젝트 최종 보고서

1. 서론

캔위성 프로젝트는 위성과 유사한 기능을 하는 간이 컴퓨터(라즈베리 파이)를 상공에 띄워 실시간 통신 및 안전한 낙하 가능성을 실험하는 프로젝트이다. 본 프로젝트의 주요 목적은 학교 주변의 교통 상황을 관측하고 특정 고도에서의 온습도를 측정하는 것이다. 캔위성은 KAIST에서 주최하는 대회가 있을 정도로 인지도가 높은 실험이다. 일반적인 캔위성 대회에서는 대회 측에서 제공하는 캔 모양의 외형을 사용하고, 내부에 라즈베리 파이나 카메라가 달린 보드를 층 형식으로 배치하며, 대회에서 준비한 화학 로켓으로 발사한다. 이러한 대회에서는 코딩이 가장 중요한 요소로 작용한다.

그러나 본 프로젝트는 대회 참가가 불가능한 상황(참가 신청 기간: 5월 20일까지, 행사 기간: 8월 7-8일)으로 인해 자체적으로 진행되었다. 따라서 캔위성 키트를 사용하지 않고 직접 제작하는 방식을 선택하였다. 이러한 접근 방식은 더 많은 도전과 학습 기회를 제공하지만, 동시에 더 많은 기술적 어려움도 동반한다.

캔위성을 헬륨 풍선을 이용해 띄운 후, 캔위성이 비행 중에 수집한 데이터를 확보하기 위해서는 캔위성의 착륙 위치를 정확히 알아내는 것이 중요하다. 이를 위해 GPS 모듈을 캔위성에 탑재하여 실시간으로 위치 정보를 수집하고, 착륙 지점을 파악할 수 있다. GPS를 통해 정확한 착륙 위치를 확인한 후, 해당 지점으로 이동하여 캔위성을 회수하고 저장된 데이터를 수집하게 된다.

GPS를 통해 착륙 위치를 확인할 수 있지만, 캔위성의 위치를 예측하려는 이유는 여러 가지가 있다. 우선, 효율적인 회수 작업을 위해서이다. 캔위성의 추락 위치를 사전에 예측하면 회수 팀이 신속하게 현장에 도착할 수 있어 시간과 자원을 절약할 수 있다. 또한, 예측된 위치를 바탕으로 인구 밀집 지역이나 위험 지역을 피하도록 조정하여 주변 사람들과 환경의 안전을 보장할 수 있다. 또 다른 이유로는 데이터의 신뢰성을 증가시키는 것이다. 예측을 통해 캔위성이 안정적으로 작동하고 있는지 확인할 수 있으며, 만약 캔위성이 예상 위치에 도달하지 않을 경우 문제의 원인을 분석하고 해결하는 데 도움이 된다.

이러한 과정을 통해 캔위성 프로젝트는 기술적 도전뿐만 아니라 안전과 효율성을 동시에 고려하는 중요한 실험으로 자리잡는다.

2. 실험 준비

2.1 부품 선정

구조적 안정성과 기능성을 고려하여 다음과 같은 부품들을 선정했다:

  • 라즈베리 파이 4B (메인 컴퓨터): 고성능 처리 능력과 다양한 인터페이스를 제공하여 데이터 처리와 통신에 적합하다.
  • 카메라 모듈 3 (영상 촬영용): 고해상도 이미지 캡처가 가능하여 지상 관측에 이상적이다.
  • LTE-CatM1, 쉴드보드 (통신용): 장거리 통신이 가능하여 실시간 데이터 전송에 적합하다.
  • 아두이노 UNO (센서 제어용): 다양한 센서와의 호환성이 좋고, 저전력 운용이 가능하다.
  • DHT11 온습도 센서 (온습도 측정): 경량이면서도 신뢰할 만한 온습도 데이터를 제공한다.
  • GPS NEO 7M 수신모듈 (위치 추적): 정확한 위치 데이터를 제공하여 캔위성의 궤적을 추적하는 데 필수적이다.
  • 페트병 (캔위성 몸체): 가볍고 내구성이 있어 캔위성의 외형 구조물로 적합하다.
  • 헬륨 및 풍선 (상승용): 화학 로켓 대신 사용할 수 있는 안전하고 경제적인 상승 방법이다.
  • 낙하산 (안전 착륙용): 캔위성의 안전한 착륙을 보장하여 장비 보호와 데이터 회수를 가능하게 한다.

이러한 부품들은 각각의 특성과 기능을 고려하여 선택되었으며, 전체적인 시스템의 무게와 성능 사이의 균형을 맞추는 데 주력했다.

2.2 발사 방식

화학 로켓 사용이 불가능한 상황에서 다음과 같은 옵션을 고려했다:

  • 드론: 400g 이상의 하중을 견딜 수 있는 적절한 드론이 없어 제외되었다. 또한, 드론의 비행 시간 제한과 고도 제한도 고려 사항이었다.
  • 헬륨 풍선: 최종적으로 선택된 방법이다. 헬륨 풍선은 상대적으로 안전하고, 고도 도달이 용이하며, 비용 효율적이라는 장점이 있다.

헬륨 풍선을 선택한 후, 다음과 같은 세부 사항을 고려했다:

  • 풍선 크기: 캔위성의 무게를 고려하여 적절한 크기의 풍선을 선택해야 했다.
  • 헬륨 양: 캔위성을 원하는 고도까지 올릴 수 있는 충분한 양의 헬륨을 계산해야 했다.
  • 풍선 재질: 고고도에서의 온도와 압력 변화를 견딜 수 있는 재질을 선택해야 했다.

2.3.1 헬륨 풍선을 이용한 순부력 계산

부력은 물체가 유체에서 밀려 올라가는 힘으로, 다음 공식으로 구할 수 있다.

여기서:

  • 는 부력 (N)
  • 는 공기의 밀도 (kg/m³)
  • 는 헬륨 풍선의 부피 (m³)
  • 는 중력 가속도 (약 9.81 m/s²)이다.

해수면에서의 공기 밀도는 1.225 kg/m³이다. 이번 실험에서는 22.5L를 10기압으로 압축한 헬륨 가스를 3개를 사용하였다. 이로 인해 총 헬륨의 부피는 675L, 즉 0.675 m³가 된다. 이를 공식에 대입하면:

따라서 부력은 8.11 N이다.

다음으로 순부력 ()을 구하기 위해 중력을 계산해야 한다. 중력은 다음 공식으로 구할 수 있다.

여기서 전체 질량(캔위성, 낙하산, 풍선, 헬륨의 질량)은 0.736 kg이다. 따라서 중력 가속도와 곱하면 약 7.22 N이다. 순부력 ()은 부력에서 중력을 뺀 값이다.

따라서 순부력은 약 0.89 N이다.

2.3.2 공기 저항과 최종 속도

최종 속도는 물체가 더 이상 가속하지 않고 일정한 속도로 움직이는 상태로, 순부력과 공기 저항 ()이 균형을 이룰 때이다.

공기 저항 ()는 다음의 공식으로 계산할 수 있다.

여기서:

  • 는 항력 계수 (물체의 형태에 따라 다르다)
  • 는 단면적 (m²)
  • 는 최종 속도 (m/s)이다.

따라서 연립하여 풀어주면:

공기 저항이 순부력과 같기 때문에 , 단면적 ()을 구하기 위해서는 아래 그림의 넓이를 알면 된다.

위 넓이를 구하면:

헬륨 풍선의 항력 계수를 구하는 것은 시뮬레이션으로도 가능하지만, 매우 복잡한 작업이다. 따라서 헬륨 풍선을 하나의 큰 원으로 간주하여 항력 계수를 계산하였다. 원의 항력 계수는 일반적으로 0.47로 알려져 있다. 이 값을 이용하여 최종 속도 ()를 구하면:

따라서, 해수면 근방에서 헬륨 풍선의 최종 속도는 약 1.26 m/s이다. 이제 고도에 따른 공기 밀도를 고려하여, 각 고도에서의 최종 속도를 계산할 수 있다.

고도별 공기 밀도
고도(m) 공기 밀도(kg/m³)
0 1.225
1,000 1.112
2,000 1.007
3,000 0.909
4,000 0.819
5,000 0.736
10,000 0.413

따라서 고도별 최종 속도는 다음과 같다.

고도별 최종 속도
고도(m) 최종 속도(m/s)
0 1.26
1,000 1.32
2,000 1.39
3,000 1.44
4,000 1.54
5,000 1.63
10,000 2.13

위의 모든 계산을 Python을 사용하여 그래프와 표로 나타내었다.

  • 10,000m에 도달 시간: 98.27분
  • 종단 속도: 3.60 m/s
  • 자유낙하 시간: 46.35분
  • 총 이동 시간: 144.62분

3. 실험 과정

3.1 코딩

초기에는 우분투 OS를 사용할 계획이었으나, ssh 사용의 용이성 때문에 라즈비안 OS로 전환했다. 이 과정에서 다음과 같은 주요 작업을 수행했다:

1. 라즈비안 OS 설치 및 구성 2. 필요한 라이브러리 및 드라이버 설치 3. 센서 데이터 수집을 위한 Python 스크립트 작성 4. LTE 모듈을 통한 데이터 전송 스크립트 개발 5. 카메라 모듈 제어 및 이미지 캡처 코드 구현

통신 방식은 구글 드라이브로 데이터를 전송하는 단방향 송신 방식을 채택했다. 이를 위해 다음과 같은 코드를 구현했다:

import time
from picamera import PiCamera
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
from oauth2client.service_account import ServiceAccountCredentials

def capture_and_upload():
    camera = PiCamera()
    camera.resolution = (1024, 768)
    camera.start_preview()
    time.sleep(2)
    camera.capture('/home/pi/image.jpg')
    camera.stop_preview()

    credentials = ServiceAccountCredentials.from_json_keyfile_name('path/to/credentials.json', ['https://www.googleapis.com/auth/drive'])
    drive_service = build('drive', 'v3', credentials=credentials)

    file_metadata = {'name': 'image.jpg'}
    media = MediaFileUpload('/home/pi/image.jpg', resumable=True)
    file = drive_service.files().create(body=file_metadata, media_body=media, fields='id').execute()

while True:
    capture_and_upload()
    time.sleep(5)

이 코드는 5초마다 사진을 촬영하고 구글 드라이브에 업로드한다. 실제 구현 시에는 에러 처리와 로깅 등을 추가하여 안정성을 높였다.

GPS 및 온습도 측정 데이터 저장을 위해 아두이노로 측정한 데이터를 연결된 라즈베리파이에서 txt 파일로 저장할 수 있도록 했다. 이를 위한 아두이노 코드의 일부는 다음과 같다:

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <DHT.h>

TinyGPSPlus gps;
SoftwareSerial ss(4, 3);
DHT dht(2, DHT11);

void setup() {
  Serial.begin(9600);
  ss.begin(9600);
  dht.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  while (ss.available() > 0) {
    if (gps.encode(ss.read())) {
      if (gps.location.isValid()) {
        Serial.print(gps.location.lat(), 6);
        Serial.print(",");
        Serial.print(gps.location.lng(), 6);
        Serial.print(",");
        Serial.print(h);
        Serial.print(",");
        Serial.println(t);
      }
    }
  }

  delay(1000);
}

이 코드는 GPS 위치와 온습도 데이터를 수집하여 시리얼 포트로 전송한다. 라즈베리파이에서는 이 데이터를 읽어 파일로 저장하고 필요시 구글 드라이브로 업로드한다.

3.2 문제 해결 과정

프로젝트 진행 중 여러 기술적 문제에 직면했다. 그 중 가장 큰 문제는 라즈베리파이에서 'pip install pyserial' 명령어가 작동하지 않는 것이었다. 이 문제를 해결하기 위해 다음과 같은 단계를 거쳤다:

1. 문제 확인: sudo를 사용해도 'externally-managed-environment' 오류가 발생했다.
2. 원인 분석: 운영체제의 패키지 관리자와 pip 간의 충돌이 원인으로 추정되었다.
3. 해결 방안 모색: 가상환경을 사용하여 시스템 전체에 영향을 주지 않고 패키지를 설치하는 방법을 고려했다.
4. 해결 과정:

  a. 가상환경 생성: python3 -m venv myenv
  b. 가상환경 활성화: source myenv/bin/activate
  c. 필요한 패키지 설치: pip install pyserial

5. 결과 확인: 가상환경 내에서 pyserial이 정상적으로 설치되고 작동함을 확인했다.

이러한 문제 해결 과정을 통해 리눅스 시스템에서의 패키지 관리와 가상환경의 중요성을 깨달았다. 또한, 이 경험은 향후 유사한 문제에 대처할 수 있는 능력을 길러주게 되었다.

6. 프로젝트 소감

이번 프로젝트를 통해 여러 가지 중요한 경험을 할 수 있었습니다.

첫째, 교과과정에서 학습한 보일 법칙을 활용해 물체를 띄우기 위한 헬륨의 양을 계산해보는 과정이 매우 인상적이었습니다. 이론적인 지식을 실제 상황에 적용해보는 경험은 학습의 깊이를 더해주었습니다.

둘째, 프로젝트를 진행하며 기초적인 리눅스 명령어를 학습하고 라즈베리파이를 다루면서 프로그래밍 역량을 기를 수 있었습니다. 특히 운영 체제 간의 차이점과 각각의 장단점을 직접 경험해볼 수 있었던 것이 큰 도움이 되었습니다.

셋째, 프로젝트 도중에 발생한 문제 상황의 원인을 판단하고 해결방안을 모색하는 과정을 통해 문제해결능력을 기를 수 있었습니다. 특히 라즈베리파이에서 발생한 패키지 설치 문제를 해결하기 위해 가상환경을 설정하는 방법을 배운 것은 향후 프로젝트에도 유용하게 적용할 수 있을 것 같습니다.

마지막으로, 이론과 실제의 차이를 직접 체험할 수 있었습니다. 계산상으로는 가능해 보였던 일들이 실제 환경에서는 여러 가지 변수로 인해 예상대로 되지 않는 경우가 많았습니다. 이를 통해 실험 설계의 중요성과 여러 변수를 고려해야 하는 필요성을 깨달았습니다.

이번 프로젝트는 비록 완벽한 성공을 거두지는 못했지만, 그 과정에서 얻은 경험과 교훈은 앞으로의 학업과 연구 활동에 큰 도움이 될 것입니다. 향후에는 이번 경험을 바탕으로 더 정교하고 성공적인 프로젝트를 수행할 수 있기를 기대합니다.

참고문헌

1. KAIST 캔위성 경연대회 공식 웹사이트, https://cansat.kaist.ac.kr/m05_01 (접속일: 2024년 8월 6일) 2. 기상청 날씨누리, "2024년 7월 17일 기상 데이터", https://www.weather.go.kr/w/observation/land/aws-obs.do (접속일: 2024년 8월 6일) 3. Brusca, S., Famoso, F., Lanzafame, R., Mauro, S., Messina, M., & Strano, S. (2016). "Theoretical and Experimental Study of Helium Balloons for Solar Chimneys". Energy Procedia, 101, 520-527. 4. Yajima, N., Imamura, T., Izutsu, N., & Abe, T. (2009). "Scientific Ballooning: Technology and Applications of Exploration Balloons Floating in the Stratosphere and the Atmospheres of Other Planets". Springer Science & Business Media.