예산으로 정확한 비행 추적: 라즈베리 파이 제로 와이어리스, SDR, FlightAware
이 기사는 라즈베리 파이 제로 와이어리스를 사용하여 해당 지역의 비행을 추적하는 두 가지 방법을 보여줍니다. 또한 64×64 RGB 매트릭스를 제어하는 방법도 보여줍니다.
라즈베리 파이 제로 와이어리스는 많은 일을 할 수 있는 $10 마이크로컴퓨터입니다. 이 기사는 이 파이를 사용하여 해당 지역의 비행을 추적하는 두 가지 방법을 보여줍니다. 또한 RPi Zero W를 사용하여 64×64 RGB 매트릭스를 제어하여 비행 번호를 표시하는 방법을 보여줍니다!
이 기사에서 저는 라즈베리 파이 제로 와이어리스를 사용하여 세 가지 별도 프로젝트를 수행합니다. 프로젝트 1에서는 PiAware를 사용하여 비행기 추적 장치를 만듭니다. 프로젝트 2에서는 해당 비행기에서 데이터를 수집합니다. 프로젝트 3에서는 RPi Zero W로 64×64 RGB 매트릭스를 제어하는 방법을 보여줍니다.
프로젝트 1: 라즈베리 파이 제로 와이어리스 비행기 추적기
| 부품 | 비용 | 비고 |
| 라즈베리 파이 제로 와이어리스 | $10 | |
| SDR 수신기 | $21 | 다른 USB SDR 수신기도 작동할 가능성이 높음 |
| 4GB 마이크로SD 카드 | $6 | 더 큰 카드도 작동 |
| USB-마이크로USB 어댑터 | $5 | |
| 마이크로USB 허브 (선택사항) | $8 | 파이 제로는 마이크로USB 포트만 있음; 액세서리 부착 위해 허브/컨버터 필요 |
| 광대역 안테나 (선택사항) | $50 | 안테나는 1090MHz 커버해야 함 |
| 1090MHz 대역통과 필터 (선택사항) | $20 | |
리소스
- 라즈비안 제시 (설치 가이드)
- PiAware 설치
이 실험은 라즈베리 파이 제로 와이어리스를 사용하여 수행되었습니다. 그러나 다음 코드는 라즈베리 파이 버전 2 이상에서 작동해야 합니다. 무선 기능이 없는 파이 제로를 구입한 경우, 무선 USB 네트워크 동글로 추가할 수 있습니다.
1단계: SD 카드 준비
컴퓨터에 최신 라즈비안 제시를 다운로드하세요.
이미지를 SD 카드에 쓰세요 (리눅스, 맥 OS, 윈도우 가이드 참조).
2단계: SD 카드 수정
SD 카드 루트 디렉토리에 "ssh"라는 이름의 파일을 생성하세요. 확장자 없음, 내용 없음. 이 파일은 SSH를 활성화하여 파이에 원격 접속할 수 있게 합니다.
다음 내용으로 "wpa_supplicant.conf" 파일을 생성하세요. YourWifiName과 YourWifiPassword 값을 귀하의 와이파이 네트워크 이름과 비밀번호로 변경하세요.
network={
ssid="YourWifiName"
psk="YourWifiPassword"
key_mgmt=WPA-PSK
}
3단계: 설치 및 부팅
컴퓨터에서 SD 카드를 추출하고 라즈베리 파이 제로 와이어리스에 설치하세요. 보드 끝부분에 가장 가까운 마이크로USB 포트를 사용하여 파이를 전원에 연결하세요. 라즈베리 파이가 부팅되고 와이파이에 연결될 때까지 약 1분 기다리세요. 이 구성 파일로 키보드, 마우스, 디스플레이 없이 장치를 사용할 수 있습니다.
4단계: 파이 위치 찾기
라우터에 로그인하여 연결된 장치를 보거나, Look@Lan(윈도우) 또는 nmap(리눅스 및 맥) 같은 IP 스캐너를 통해 파이의 IP 주소를 식별하세요. 2~3분 내에 장치가 나타나지 않으면 전원 차단, 파이에서 SD 카드 제거, 컴퓨터에 재삽입하여 ssh와 wpa_supplicant.conf 파일을 다시 확인하세요.
5단계: 파이에 연결
윈도우: Putty 같은 도구를 사용하여 파이에 연결하세요. 프로그램을 다운로드하고 실행하고, 파이의 IP 주소를 입력하고 "연결"을 클릭하세요. 보안 인증서에 대한 창이 나타납니다. "예"를 클릭하세요.
리눅스 및 맥: 터미널을 열고 "ssh pi@raspberrypi.local" 또는 "ssh pi@ipaddress"(예: "ssh pi@192.168.0.52")를 입력하세요.
프롬프트에서 기본 사용자명은 "pi"이고 기본 비밀번호는 "raspberry"입니다.
6단계: 파이 구성
"sudo raspi-config"를 입력하고 엔터를 누르세요.
비밀번호, 시간대, 로컬라이제이션을 변경하세요.
비밀번호 프롬프트가 나타나면 현재 비밀번호는 "raspberry"입니다. 장치를 해킹하기 최소한 어렵게 만들기 위해 더 안전한 것으로 변경하세요. 참고로, 비밀번호 대신 인증서를 인증에 사용해야 하지만 이 기사에서는 다루지 않습니다.
다음 명령어를 입력하고 실행을 허용하세요:
wget https://flightaware.com/adsb/piaware/files/packages/pool/piaware/p/piaware-support/piaware-repository_3.3.0_all.deb
sudo dpkg -i piaware-repository_3.3.0_all.deb
sudo apt-get update
sudo apt-get dist-upgrade -y
sudo apt-get install -y piaware fail2ban libio-socket-ssl-perl
sudo piaware-config allow-auto-updates yes
sudo piaware-config allow-manual-updates yes
sudo apt-get install dump1090-fa -y
sudo reboot
라즈베리 파이가 부팅 프로세스를 완료하면, 컴퓨터에서 웹 브라우저를 열고 https://raspberrypi.local:8080으로 이동하세요(또는 raspberrypi.local을 장치의 IP 주소로 대체). 비행기가 화면에 나타나고 사라지기 시작하면 축소한 다음 위치로 확대하세요.
파이, SDR, 안테나 시스템을 밖으로 가져가면 비행기 수를 늘릴 수 있습니다. 1090MHz 대역통과 필터와 더 나은 안테나를 추가하면 추가 개선이 가능합니다.

로스앤젤레스 동쪽 지역을 보여주는 PiAware 수신기 스크린샷, 2017년 3월 14일(파이 데이!). 상단의 선형 트랙은 LAX에 착륙할 준비가 된 비행기들. 정부 비행기가 원을 그리며 비행하는 것도 보임.
마지막으로, FlightAware.com 계정을 생성하고 수신기를 FlightAware.com 계정과 연관시키세요.
ADS-B, PiAware, dump1090
항공기에 부착된 트랜스폰더는 4자리 8진수 식별자(모드-A 일명 "스쿼크") 식별자 및 고도(모드-C), 24비트 고유 ICAO 번호(모드-S), 추가 정보가 있는 24비트 ICAO 번호(모드 S 확장 스퀴터)를 방송할 수 있게 합니다. 마지막 모드는 ADS-B로도 알려져 있습니다.
자동 종속 감시-브로드캐스트(ADS-B)는 항공기의 위치(GPS, GLONASS 등에 의해 결정)를 식별 정보와 결합하여 1090MHz에서 방송합니다. 다른 트랜스폰더 코드는 레이더 신호에 의한 심문에 대한 응답으로만 전송되는 반면, ADS-B는 초당 약 2회 전송됩니다.
PiAware와 dump1090은 1090MHz로 튜닝된 소프트웨어 정의 라디오(SDR)를 사용하여 주변 모든 항공기의 방송을 수신 및 디코딩하고 FlightAware 서버로 전송합니다. 정보는 라즈베리 파이의 8080포트에 호스팅된 웹 페이지에 표시됩니다.

John Macneil 일러스트, www.aopa.org.
모든 항공기는 2020년 1월 1일까지 ADS-B 아웃 트랜스폰더를 장착해야 합니다. 그때까지 FlightAware는 위도와 경도를 방송하지 않는 비행기의 위치를 다변측량으로 결정합니다. 다변측량은 최소 3개 수신기의 알려진 위치와 메시지 수신 시간을 사용하여 비행기 위치를 계산합니다.
프로젝트 2: 파이 제로 와이어리스로 FlightAware.com에서 비행기 데이터 수집
FlightAware.com에는 데이터 마이닝과 활용을 허용하는 두 개의 API(FlightXML과 Firehose)가 있습니다. 필요한 정보 유형과 월간 쿼리 수에 따라 둘 중 선택하세요. 이 프로젝트에서 All About Circuits는 한 달간 무료 접근 권한을 부여받았습니다. 따라하려면 FlightAware.com에 API 키를 문의하세요.
리소스:
1단계: 연결성 테스트
SSH로 파이 제로에 연결하고 Firehose API 연결성을 테스트하세요.
openssl s_client -host firehose.flightaware.com -port 1501 -tls1
인증 세부사항이 한두 페이지 보이면 모든 것이 올바르게 작동한 것입니다.
2단계: 샘플 파일 및 데이터 가져오기
FlightAware는 GitHub에 샘플 파일을 호스팅합니다. 샘플 파일을 다운로드하고 사용자명과 API 키로 편집하세요.
git clone https://github.com/flightaware/firehose_examples.git
cd firehose_examples/perl/example1
sudo nano example1.pl
username과 apikey 필드를 귀하의 정보와 일치하도록 변경한 후, 종료([Ctrl]+[x])하고 저장하세요.
perl example1.pl
자바스크립트 객체 표기법(JSON) 형식으로 데이터를 볼 수 있습니다:
$VAR1 = {
'aircrafttype' => 'B738',
'heading' => '105',
'pitr' => '1490038420',
'gs' => '334',
'clock' => '1490038413',
....
'hexid' => 'A44591',
'ident' => 'DAL751'
'alt' => '25100',
'lon' => '-117.38051',
'lat' => '33.53288'
};
3단계: 데이터 수집을 위한 파이 구성
Firehose는 매우 짧은 시간에 압도적인 양의 데이터(~1GB/일)를 생성할 수 있어 디스크를 채우고 계정 요금을 증가시킵니다. 따라서 정보를 수집하는 스크립트를 만들 때 정기적으로 확인해야 합니다. 디스크가 매우 빨리 차고 비용 계정이 비워질 수 있기 때문입니다.
마이크로SD 카드 크기와 수집하려는 데이터에 따라 추가 스토리지가 필요하거나 raspi-config로 돌아가 파일시스템을 확장해야 할 수 있습니다(옵션 7, 옵션 A1).
제 예제에서는 LGB, LAX, ONT, SNA 등을 포함하는 2°×2° 지리적 영역에 대한 데이터를 수집합니다(34°N ±1°, 118°W ±1°). 이 지역은 내 수신 영역과 근사하기 때문에 선택했습니다.

관심 영역은 33°N~35°N, 117°W~119°W 범위입니다.
다음 코드는 18행과 45행을 변경한 example1.pl입니다. 독자가 파일을 다운로드하지 않고 따라갈 수 있도록 모든 행을 아래에 표시합니다. example1.pl의 복사본인 position.pl을 만들고 nano로 position.pl을 편집하세요.
cp example1.pl position.pl
sudo nano position.pl
필요한 편집을 하고 [Ctrl]+[x]로 종료하세요.
1 #!/usr/local/bin/perl
2
3 use strict;
4 use IO::Socket::SSL;
5 use JSON::PP;
6 use IO::Uncompress::Inflate qw($InflateError);
7 use Data::Dumper;
8
9 my $username = 'allaboutcircuits';
10 my $apikey = 'allaboutcircuitsreallylongapikey';
11 my $compression = 0;
12
13 # FlightAware에 TLS 소켓 연결 열기.
14 my $sock = IO::Socket::SSL->new('firehose.flightaware.com:1501') or die $!;
15 # print "Connected!\n";
16
17 # 비압축 소켓에 개시 명령 전송.
18 my $initcmd = "live version 8.0 user $username password $apikey events \"position\" latlong \"33 -117 35 -119\"";
19 if ($compression) {
20 $initcmd .= " compression compress";
21 }
22 binmode $sock;
23 print $sock "$initcmd\n";
24
25 # 요청 시 압축 활성화.
26 my $zsock;
27 if ($compression) {
28 $zsock = new IO::Uncompress::Inflate $sock
29 or die "IO::Uncompress::Inflate failed: $InflateError\n";
30 } else {
31 $zsock = $sock;
32 }
33
34 # 메인 루프, 서버에서 JSON 라인 읽기.
35 my $i = 1;
36 while (my $line = $zsock->getline()) {
37 #print "LINE $i\n";
38 #print "LINE $i: ", $line, "\n";
39
40 my $data = eval { decode_json $line };
41 die "Failed to decode JSON: $line" if !defined($data) || $@;
42
43 print $data->{ident}." \t".$data->{lat}." \t " . $data->{lon} . " \t". $data->{alt}." \n";
44
45 last if ($i++ >= 10);
46 }
47 close $sock;
48
49 # print "All done.\n";
18행은 -117과 -119로 표시된 117°W와 119°W 사이의 지리적 영역(경도)의 비행기로 요청을 제한합니다. 43행은 관심 필드만 타겟팅하는 방법을 시연하도록 수정되었습니다. 이 경우 비행기의 편명, 위도, 경도, 고도를 타겟팅합니다. 45행은 서버에서 10대의 비행기 요청(이 줄은 최종 스크립트에서 주석 처리 가능).
다음 두 명령어는 프로그램을 실행하고 진행 상황을 모니터링할 수 있게 합니다:
sudo perl position.pl >> position.txt &
tail -f position.txt
첫 줄은 슈퍼유저가 perl을 사용하여 position.pl 프로그램을 실행하고 출력(>>)을 position.txt 파일에 추가하고 & 심볼로 프로그램을 백그라운드에서 실행하게 합니다.
두 번째 줄은 tail 프로그램을 사용하여 position.txt 파일의 변경사항을 추적(-f)하여 명령 완료를 모니터링할 수 있게 합니다. 완료되면 [Ctrl]+[c]로 tail을 종료하세요. 더 이상 데이터 수집에 관심이 없으면 fg로 position.pl 프로그램을 포그라운드로 가져와 중지하거나 [Ctrl]+[c]로 중단하세요.
아래 .zip 파일에는 수정된 프로그램과 출력이 포함되어 있어, 구문의 약간의 변경이 어떻게 다른 정보를 초점에 둘 수 있는지, 프로그램의 샘플 출력을 보여줍니다.
- arrivals.pl: 방금 착륙한 비행기(LAX 도착 또는 출발)의 JSON 출력
- test_landing.pl: 읽기 쉬운 출력(예: AAL1155 landed at 03/21/2017 22:00:01)
- position.pl: 지리적 직사각형(34°N ±1°, 118°W ±1°) 내 모든 비행기의 JSON 출력
- test_overhead.pl: 편명, 위도, 경도, 고도 출력(N721PP 34.36011 -118.37837 18100)
이 파일들은 FlightAware가 제공한 example1.pl에 사소한 수정을 가해 만들었습니다. 본인만의 것을 만들어 관심 있는 데이터만 캡처하려면, FlightAware Firehose API 문서를 사용하여 JSON 형식으로 적절한 정보를 요청하고, 파일 내부에서 올바른 구문을 사용하여 필요한 정보만 출력하세요.
프로젝트 3: 파이 제로 와이어리스로 64×64 RGB 매트릭스 제어
| 부품 | 비용 | 비고 |
| (2) 2×32×32 RGB 디스플레이 매트릭스 + 전원 공급 | $75 ($150) | 64×64 픽셀 디스플레이 생성 위해 총 4개의 32×32 RGB 매트릭스 필요 |
| Adafruit RGB 매트릭스 HAT + RTC 시계 | $25 | 데이터시트 |
| 20핀 IDC 케이블 (Hub75) | $7-$13 | 필요 길이 패널 구성과 파이 거리에 따라 다름 |
| 0.1인치 수 헤더 (40핀, 2×20) | $1 | 2.54mm |
1단계: Adafruit 매트릭스 HAT 준비
Adafruit.com 지침에 따라 Adafruit HAT에 수 및 암 헤더를 납땜하세요. 그런 다음 핀 4와 18 사이에 와이어를 납땜하거나 점퍼를 부착하세요. 이 프로젝트에는 DC 배럴 잭이나 나사 단자 커넥터를 부착할 필요 없습니다.
2단계: 라즈베리 파이 준비
2×20 수 헤더를 제자리에 납땜하세요.
3단계: RGB 매트릭스 준비
아래 행의 화살표가 아래를 향하고 위 행의 화살표가 위를 향하도록 RGB 매트릭스를 방향을 잡으세요(이미지 참조). 2×10 IDC 케이블을 사용하여 Adafruit HAT의 출력을 첫 번째 보드의 입력에 연결하세요. 그런 다음 첫 번째 보드의 출력을 두 번째 보드의 입력에, 두 번째의 출력을 세 번째의 입력에 연결하는 식으로 계속하세요.

RGB 매트릭스 패널 뒷면. 신호가 "C" 모양으로 보드에서 보드로 이동합니다.
레이저 커터나 CNC 머신이 있다면, 4개의 RGB 매트릭스 패널을 모두 고정할 수 있는 백플레이트 도면을 포함했습니다. 마운팅 구멍은 공통 중심점에서 정렬을 허용하기 위해 슬롯으로 대체되었습니다.

큰 64×64 패널을 만들기 위한 4개 32×32 패널 마운팅 템플릿; 다양한 패널 배열 가능.
Hughes_4x4RGBMatrix.zip
Hennen Zeller의 전체 문서 및 소스 코드.
모든 전기 연결이 완료되면 라즈베리 파이 전원을 켜세요. 약 1분 후 Putty나 SSH로 파이에 로그인을 시도하세요.
들어가면 다음을 입력하여 파이의 사운드를 비활성화하세요(문서에 따르면 사운드와 RGB 매트릭스 하드웨어 간 하드웨어 서브시스템 충돌).
cat << EOF | sudo tee /etc/modprobe.d/blacklist-rgb-matrix.conf
blacklist snd_bcm2835
EOF
sudo update-initramfs -u
그런 다음 apt-get으로 Python과 이미징 파일을 설치하세요.
sudo apt-get install -y build-essential libconfig++-dev python-dev python-imaging libgraphicsmagick++-dev libio-socket-ssl-perl
RGB 매트릭스 실행을 위한 필수 파일을 가져와 컴파일하세요.
git clone https://github.com/hzeller/rpi-rgb-led-matrix
cd rpi-rgb-led-matrix
HARDWARE_DESC=adafruit-hat-pwm make -C examples-api-use
sudo examples-api-use/demo -L -D0
cd utils/
HARDWARE_DESC=adafruit-hat-pwm make
선택적으로, 파이에 카메라가 연결되어 있다면 64×64 픽셀 이미지를 캡처하여 디스플레이에 공급할 수 있습니다.
raspistill -w 64 -h 64 -o myimg.png
sudo ./led-image-viewer -L -f myimg.png
앞의 두 줄은 64×64 이미지를 디스플레이에 캡처하고, 이전 섹션에서 컴파일된 led-image-viewer 프로그램을 사용하여 큰 디스플레이(-L)에 영원히(-f) 표시합니다.
다음 단계는?
이제 안테나와 SDR 수신기로 또는 API 호출로 주변 항공기를 추적하고, 해당 항공기에 대한 원하는 정보를 64픽셀 × 64픽셀 디스플레이나 라즈베리 파이 제로 W의 HDMI 출력에 표시할 수 있는 $10 컴퓨터를 갖게 되었습니다.
이를 어떻게 활용할지는 오직 상상력에만 제한됩니다.
이 기사가 도구만 소개하므로, 첫 번째 단계로 디스플레이와 FlightAware 문서를 읽고 둘 다의 예제 프로그램을 열어 기능을 더 잘 이해하는 것을 권장합니다.
라즈베리 파이 제로가 Cron, Grep, Awk 같은 자주 사용되는 명령어로 완전한 리눅스 설치라는 것을 잊지 마세요. 파이에 아직 없는 것은 apt-get install 한 번으로 해결됩니다.
아래 비디오를 확인하여 이 프로젝트들의 정점을 확인하세요!
직접 이 프로젝트를 시도해 보세요! BOM을 받으세요.