캔위성 프로젝트 최종 보고서
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분
2.3.3 풍속 및 풍향 데이터 분석을 통한 캔위성 착륙 지점 예측
기상청 날씨누리를 활용하여 2024년 7월 17일 13~15시의 날씨를 알아보고 풍속 및 풍향 데이터 분석을 통해 예측해보았다.
위 데이터를 활용하면 평균 풍향과 풍속을 구할 수 있다. 평균 풍향은 남남동(SSE) 방향이며, 풍속은 이다. 참고로, 남남동(SSE)은 북풍을 로 할 때 에 해당한다. 또한, 평균 속도와 시간을 이용하여 이동 거리를 계산하면 가 나온다. 이를 통해 헬륨 풍선의 착륙 지점을 예측하면
3. 실험 과정
3.1 위성 제작(하드웨어 부문)
우선 초소형 컴퓨터 역할을 하는 라즈베리파이4B 모델의 부품 조립이 시작되었다. 라즈베리파이의 GPIO 핀을 통해 다른 센서들과 소통하기 때문에, 우선 컴퓨터의 운영 체제를 까는 동안에만 디스플레이를 연결하고, 이후 ssh 연결 후 디스플레이와 본체를 분리하여 다른 센서들과의 연결 준비를 마쳤다.
LTE 센서와 라즈베리파이를 GPIO 핀을 통해 직접 연결한다. 데이터 유심은 sk텔레콤의 데이터 함께쓰기 유심을 활용하였다. 센서를 쉴드보드와 연결하고 이를 라즈베리파이 위에 덮는다. GPIO 핀 헤더(약 500원)를 구매했다면 아주 쉽게 연결할 수 있었지만(40개 핀을 모두 헤더로 연결한 후 센서에 있는 헤더를 GPIO 핀으로 활용한다) 구매를 까먹어 버려서 어쩔 수 없이 모두 납땜하였다. 그것도 점퍼선을 일일이 잘라서...
LTE 센서와 카메라 센서는 라즈베리파이와 직접 연결하고, IMU 센서와 GPS, 온습도 센서는 실시간 처리 작업이 용이한 아두이노 UNO를 활용했다.(컴퓨터실에는 정체 모를 아두이노 UNO가 아주 많이 쌓여있다.) 따라서 라즈베리파이의 USB 포트 2개를 모두 아두이노에 연결하고 라즈베리파이는 소형 보조배터리를 통해 전원을 공급한다.
다음은 낙하산과 부품이 들어갈 단열 스타이로폼 상자를 만들었다. 상자 외부에 연락처와 실험 목적을 밝히고 카메라 등 외부 센서와 상호작용 할 수 있는 공간도 마련해 두었다.
떨어졌을 때의 충격을 흡수할 방안과 고도가 올라감에 따라 생기는 기온 변화에 최대한 버틸 수 있도록 제품을 설계하였다. 실제로 떨어뜨려 보며 충격을 얼마나 받는지와 이론적 계산 등을 고려하여 스펀지와 같은 완충제를 넣어보기도 하고, 겉을 감싸보기도 했다. 가장 중요한 점은 온도 변화이다. 라즈베리파이는 전력 소모가 크기에 그만큼 열을 많이 방출한다. 그러나 고도가 올라갈 수록 외부에서 빼앗는 열도 많아지기 때문에 그 사이의 적절한 균형을 유지하는 것이 중요했다. 컴퓨터의 열이 너무 많다면 이 또한 프리징 현상이나 작동 오류가 생기는 원인이 되기 때문이다.
그렇게 해서 최종적으로 설계된 제품이 위의 사진과 같은 캔위성이다. 캔위성보다는 페트병위성에 가깝지만, 내부 사정에는 수많은 공학적 고민들이 들어갔다. 무게와 온도 변화를 어떻게 이겨내며 버틸 수 있을까와 센서들과의 작동성을 보장할 방법 등을 수없이 고민했다. 온습도 센서 또한 위성 내부의 열과 무관하게 작동해야 하기 때문에 이를 계산하는 알고리즘 식도 복잡해졌다.
3.2 코딩
초기에는 우분투 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.3 문제 해결 과정
프로젝트 진행 중 여러 기술적 문제에 직면했다. 그 중 가장 큰 문제는 라즈베리파이에서 '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이 정상적으로 설치되고 작동함을 확인했다.
이러한 문제 해결 과정을 통해 리눅스 시스템에서의 패키지 관리와 가상환경의 중요성을 깨달았다. 또한, 이 경험은 향후 유사한 문제에 대처할 수 있는 능력을 길러주게 되었다.
4. 제작 이후
캔위성을 제작하고 통신 문제, 전력 문제, 센서 연결 문제 등등을 모두 해결하는 데 약 3일의 시간이 흐르게 되었고, 마지막 날이 되어서야 발사 실험을 해볼 수 있게 되었다. 모든 기능이 정상적으로 작동할 때, 두 가지의 실험을 진행하게 되었다.
4.1 헬륨 풍선을 이용한 발사
직경이 90cm인 풍선 4개를 가져와서 헬륨을 채웠다. 이 발사 실험을 하기까지의 수많은 노고가 있었기에 모두가 들뜬 마음과 긴장된 마음이 공존된 채 발사에 임했다.
다시 기억을 더듬어 보자면 풍선을 채우는 데에서 정말 많은 고생을 했었던 기억이 난다. 주입기 없이 커다란 풍선에 헬륨을 채우는 것은 정말 등에 땀이 흥건해질 정도로 힘든 일이었다. 이로 인해 풍선에 생각보다 적은 헬륨을 넣은 것이 문제가 되었을까. 위성에 부력이 생기긴 했지만 한없이 올라갈 것 같진 않았다.
캔위성을 정상적으로 날아가는 데에는 훨씬 더 많은 헬륨이 필요하다는 사실을 몸소 깨달을 수 있었다. 우리는 이러한 경험을 바탕으로 되먹임 과정을 거쳐 다시 실험에 나서기로 한다.
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.