整合 GPS 模組、無線電廣播與語音合成技術,開發可追蹤飛行軌跡的氣象氣球。利用 Python 程式讀取 GPS 資料,並將其寫入日誌檔案,同時透過 PiFM 廣播位置資訊,並使用 Festival 將資料轉換為語音播報。地面端則可使用 KML 轉換程式碼將日誌檔案轉換成 KML 格式,便於在 Google Earth 等地圖軟體上呈現氣球的飛行路徑,實作即時監控與資料分析。文章涵蓋硬體組態、軟體設定、程式碼範例與操作步驟,提供完整的氣象氣球建置與追蹤方案。
KML 轉換程式碼
回到地面後使用此部分轉換之前記錄好的日誌檔案成 KML 指標檔案。
import string
# 開啟檔案進行讀寫操作.
gps = open('locations.log', 'r')
kml = open('plane.kml', 'w')
# 寫入 KML 首部資訊.
kml.write('<?xml version="1.0" encoding="UTF-8" ?>\n')
kml.write('<kml xmlns="http://www.opengis.net/kml/2.2">\n')
kml.write('<Document>\n')
kml.write('<name>Plane Path</name>\n')
kml.write('<description>Path taken by plane</description>\n')
#定義樣式。
kml.write('<Style id="yellowLineGreenPoly">\n')
kml.write('<LineStyle><color>7f00ffff</color><width>4</width></LineStyle>\n')
kml.write('<PolyStyle><color>7f00ff00</color></PolyStyle>\n')
kml.write('</Style>\n')
# 建立 Placemark 元素。
kml.write('<Placemark><name>Plane Path</name>\n')
kml.write('<styleUrl>#yellowLineGreenPoly</styleUrl>\n')
kml.write('<LineString>\n')
kml.write('<extrude>1</extrude><tesselate>1</tesselate>\n')
kml.write('<altitudeMode>relative</altitudeMode>\n')
內容解密:
此段落是將KML格式之圖層樣式初始化並在KML檔案中建立一個新之Placemark元素。Placemark即代表地理位置之圖層點元素。「
# 寫入座標資訊.
for line in gps:
coordinate = string.split(line)
longitude = coordinate[0]
latitude = coordinate[1]
altitude = coordinate[2]
kml.write(longitude + "," + latitude + "," + altitude + "\n")
# 寫入 KML 底部資訊.
gps.close()
內容解密:
此段落負責將之前由GPS取得之資料逐條寫入KML格式檔案中。longitude、latitude、altitude分別代表經、緯及海拔之值.**string.split(line)**表示將每條字串分割成為經緯及海拔之不同引數。最後關閉之前開啟之日誌檔.
# 建立折線物件.
"""
在此處我們需要新增一個完整閉合線段來確保座標正確顯示在地圖上,
但是因為我們只有一條線路所以無需新增閉合點。
"""
"""
"""
""" """
"""
""" """
""" """
"""
"""
"""
"""
"""
"""
"""
```python`
"""
```python
""""
""""
```python```
"""
```python
""""
```python`
```python`
"
"""
"""
```shell
"""
"
"""
"""
"""
"
""
""
"""
"
"""
"""
“"
"”" `
`
```
"""
"`
"
"
## 發射氣象氣球
氣象氣球可能對許多人來說並不陌生。這些氣球直徑可達20英尺,通常充滿氦氣後,搭載小型科學裝置,能升至大氣層的高處,並在升空過程中記錄各種感測器資料。當外部壓力顯著低於氣球內部壓力時,氣球會爆裂,裝置則依靠小型降落傘傳回地面。發射團隊會追蹤並回收這些降落的包裹,從而取得有關大氣上層的豐富資訊。這樣一來,科學家和愛好者就能從中學到很多關於大氣上層的知識。
雖然在之前的章節中,玄貓使用Raspberry Pi控制無線遙控飛機非常酷炫,但那只是記錄了飛機的位置並將路徑資料上傳到Google Earth。本專案的概念——建造一個氣象氣球——雖然簡單但更為先進。我們將充氦並發射一個小型氣象氣球,能將Raspberry Pi送至至少30,000英尺的高空。然後我們將程式設計Pi定期拍攝照片,給我們留下飛行過程的影像記錄,並使用小型GPS單元記錄Pi的飛行軌跡。
但我們不會就此止步,因為這樣有點無聊,而且已經有許多愛好者和專業人士這樣做過了。除了這些之外,我們還能實時取得有關氣球動態的更新——如其緯度、經度甚至高度——透過程式設計Pi每隔15秒左右記錄其坐標並朗讀出來。然後我們將這些記錄廣播到地面上的無線電接收器上。我們只需將小型FM無線電調整到預先指定的頻率,就能聽到我們的氣球對我們說話,提供其當前狀態的即時更新。
### 購買所需零件
在美國,FAA規範要求你在發射前6至24小時內通知該機構相關資訊,如發射時間和地點、預測高度、氣球描述以及預測降落地點。FAA還要求你追蹤氣球位置並能隨時更新FAA相關資訊。不同國家和地區對固定和自由放飛的氣球有不同規範;更多詳細資訊請參考完整規範:[FAA規範](http://www.gpo.gov/fdsys/pkg/CFR-2012-title14-vol2/pdf/CFR-2012-title14-vol2-part101.pdf)。
以下是所需零件清單:
- Raspberry Pi 與攝影機板卡
- LiPo 電池和 5V 調節器來供電給 Pi
- 直徑為 6-7 英尺的乳膠氣象氣球
- GPS 接收器([參考](https://www.adafruit.com/products/746))
- GPS 天線(選用)([參考](https://www.adafruit.com/products/851))
- 手持式AM/FM 收音機
- 長度為10英尺的金屬線
- 小型泡沫保冷箱
- 模型火箭降落傘
- 手暖器
- 魚線——至少5,000碼
- 長度為1英尺且內徑約1英寸的手術用管子
- 氦氣——約250立方英尺
- 膠帶、電工膠帶、橡皮筋、卡扣帶
### 組態 GPS 接收器
與第 10 章中的 RC 飛機專案類別似,GPS 單元是本專案的重要部分之一。你需要安裝 Python gpsd 模組並使用 Pi 的通用非同步接收/傳輸(UART)針腳 #7 和 #8。Python gpsd 模組是一個允許裝置如 Pi 監控連線的 GPS 和自動識別系統(AIS)接收器的一系列程式碼函式庫的一部分,並提供了 C、C++、Java 和 Python 的埠。它允許你“讀取”大多數 GPS 接收器傳輸的國家海事電子協會格式資料。
UART 介面是一個舊介面;它基本上是一個序列(RS-232)連線,但對我們來說已經足夠了。它由正負極供電連線以及傳輸和接收引腳組成。首先輸入以下指令來安裝讀取 GPS 必需的軟體 gpsd 和其相關程式:
```bash
sudo apt-get install gpsd gpsd-clients python-gps
```
這將安裝 gpsd 及其所有依賴項和相關程式。接下來你需要設定 Pi 透過 UART Tx(傳輸)和 Rx(接收)針腳進行通訊,因為它們預設組態是與終端視窗進行通訊。要這樣做首先複製 `/boot/cmdline.txt`:
```bash
sudo cp /boot/cmdline.txt /boot/cmdlinecopy.txt
```
然後透過輸入 `sudo nano /boot/cmdline.txt` 編輯該檔案。刪除以下行:
```
console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
```
使檔案內容如下:
```
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
```
`/boot/cmdline.txt` 檔案在 Pi 啟動時向 Linux 核心傳遞引數。
儲存後編輯 `inittab` 檔案:
```bash
sudo nano /etc/inittab
```
註解掉告訴 Pi 啟動終端連線(最後一行)的那一行:
```
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
```
#### 內容解密:
以上步驟是設定Raspberry Pi與GPS模組進行通訊所必需的準備工作。
1. 安裝所需軟體:gpsd、gpsd-clients及python-gps。
- `gpsd` 是 GPS Daemon 的縮寫,用於處理和管理來自 GPS 裝置的資料。
- `gpsd-clients` 提供了多種客戶端工具來與 `gpsd` 互動。
- `python-gps` 提供了 Python 語言對 `gpsd` 的支援。
2. 編輯 `/boot/cmdline.txt` 檔案以移除與序列埠終端相關的組態。
- 預設情況下,Raspberry Pi 的序列埠(UART)被用作終端輸入輸出。
- 把序列埠重新組態給 GPS 模組使用。
3. 編輯 `/etc/inittab` 檔案以移除自動啟動終端服務。
- 在 `inittab` 中有一行組態會自動啟動序列埠終端服務。
- 註解掉該行以確保序列埠可以完全用於 GPS 模組通訊。
以上三個步驟保證 Raspberry Pi 與 GPS 模組之間能夠正常進行資料交換和處理。
```mermaid
graph TD;
A[安裝必要軟體] --> B[編輯 cmdline.txt];
B --> C[編輯 inittab];
A --> D[GPS 資料處理];
C --> D;
D --> E[完成組態];
```
此圖示展示了設定GPS模組與Raspberry Pi進行通訊所需的完整流程:
1. 安裝必要軟體:包括gpsd、gpsd-clients及python-gps。
2. 編輯cmdline.txt以移除序列埠終端相關組態。
3. 編輯inittab以移除自動啟動終端服務。
4. 上述步驟完成後即可開始進行GPS資料處理。
最後註意到在不同國家和地區對放飛氣象氣球有不同規範和法規需要遵守,
確保在進行實際操作前已經充分了解並取得所需授權。
### 建議改進點
未來可以考慮增加更多感測器以收集更多環境資料或改進GPS定位精確度。
此外也可以尋找更便宜或更長壽命的氦氣替代品以減少成本開支並提升飛行時間效益。
## 氣象氣球的開發與應用
氣象氣球是一種利用飛行中無線電波傳送資料的裝置,它可以在高空中採集各種環境資料,例如溫度、濕度、壓力等。本章節將詳細介紹如何使用樹莓派(Raspberry Pi)搭建一個氣象氣球,包括GPS定位、資料儲存、無線電傳輸以及語音合成技術。
### GPS定位系統
首先,我們需要將GPS接收器連線到樹莓派。以下是具體步驟:
1. **重新啟動樹莓派**:在終端機中輸入 `sudo reboot` 重新啟動樹莓派。
2. **焊接GPS板的引腳**:在樹莓派重新啟動時,將GPS板的引腳焊接到GPS板上。儘管這個專案只需要四個引腳,但為了未來可能的使用,請確保所有引腳都連線好。
3. **連線GPS接收器**:使用跳線連線如下:
- 將GPS板的VIN連線到樹莓派的5V引腳(#2)。
- 將GND引腳連線到樹莓派的地線(#6)。
- 將Tx和Rx引腳分別連線到樹莓派的Rx和Tx引腳(#10和#12)。
連線完成後,你應該會看到GPS模組上的紅色LED閃爍,表示模組已通電。如果你購買了外部天線,請將其連線到GPS板上的小聯結器。內部可能需要一段時間來檢測到衛星訊號,當紅色LED從每秒閃爍一次變為每15秒閃爍一次時,表示GPS已鎖定衛星。
#### 內容解密:
- **步驟1**:重新啟動樹莓派以確保系統穩定。
- **步驟2**:焊接所有引腳以備未來使用。
- **步驟3**:根據規範正確連線GPS模組的電源、地線及通訊引腳。
### 啟動gpsd服務
要使用gpsd程式,需要在終端機中輸入以下命令來啟動它:
```bash
sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock
```
然後,輸入以下命令來檢視當前GPS資料:
```bash
cgps -s
```
這個命令會啟動一個通用的GPS客戶端程式,顯示gpsd程式接收到的資料。這是一個簡單的方式來確認GPS模組是否正常工作。然後我們會使用Python中的gps模組來與GPS板進行通訊。
### 資料儲存
我們需要將GPS資料寫入檔案中,以便後續讀取、記錄和傳輸。以下是具體操作步驟:
1. **開啟Python提示符**:在終端機中開啟Python提示符並輸入以下命令:
```python
f = open('testfile.txt', 'w')
```
這行程式碼開啟了一個名為`testfile.txt`的檔案,並且以寫入模式開啟。第二個引數可以是以下四個值之一:
- `'r'`:只讀模式。
- `'w'`:只寫模式,會覆寫原有資料。
- `'a'`:追加模式。
- `'r+'`:讀寫模式。
2. **寫入資料**:繼續輸入以下命令:
```python
f.write('This is a test of my file-writing')
f.close()
```
3. **檢查檔案內容**:離開Python提示符並列出目錄內容,你應該能看到`testfile.txt`檔案並且其內容與你剛剛寫入的一致。
4. **覆寫原有資料**:再次開啟Python提示符並輸入以下命令:
```python
f = open('testfile.txt', 'w')
f.write('This text should overwrite the first text')
f.close()
```
離開Python提示符後,你會發現原有檔案內容被覆寫了。這正是我們在GPS定位檔案中所需的操作方式:每次都覆寫原有位置資料。
#### 內容解密:
- **開啟檔案**:使用`'w'`引數開啟檔案時會覆寫原有資料。
- **寫入與關閉檔案**:這些操作確保我們能夠正確地將資料寫入檔案並關閉檔案。
- **檢查與覆寫**:透過檢查檔案內容來確認操作成功。
### 使用PiFM進行無線電傳輸
為了讓樹莓派能夠透過無線電傳輸訊息,我們需要使用PiFM模組。這是由倫敦帝國理工學院機器人協會開發的一個小型駭客工具。
1. **下載PiFM**:在終端機中進入你的`/balloon`目錄並輸入以下命令:
```bash
wget http://omattos.com/pifm.tar.gz
```
2. **解壓縮下載檔案**:下載完成後,輸入以下命令解壓縮:
```bash
tar -xvzf pifm.tar.gz
```
解壓縮完成後,你將獲得一個編譯好的二進位制檔案以及原始碼和一些音訊檔案。
3. **測試PiFM**:將一根約30釐米長的導線連線到樹莓派的引腳#7(GPIO引腳#4)。然後在終端機中輸入以下命令:
```bash
sudo ./pifm sound.wav 100.0
```
調整你的收音機到100.0 FM頻道,你應該能聽到音樂播放。如果沒有聽到聲音,嘗試在命令末尾新增`22050`(音訊檔案的取樣率)。
#### 內容解密:
- **下載與解壓縮**:這些步驟取得並準備好PiFM工具。
- **測試PiFM**:透過播放音樂來測試PiFM工具是否正常工作。
### 安裝語音合成軟體Festival
要讓樹莓派能夠發聲,我們需要安裝一個語音合成軟體Festival。這是一個免費且易於使用的工具。
1. **安裝Festival**:在終端機中輸入以下命令安裝Festival:
```bash
sudo apt-get install festival
```
安裝完成後,插上耳機並在終端機中輸入以下命令測試語音合成功能:
```bash
echo "I'm sorry Dave, I'm afraid I can't do that." | festival --tts
```
這段話出自經典電影《2001太空漫遊》中的HAL9000。
2. **從檔案讀取語音合成**:我們需要讓Festival從一個文字檔案中讀取文字並進行語音合成。最簡單的方法是使用Festival提供的`text2wave`功能。這個功能可以從指定的文字檔案中讀取文字並生成語音檔案。
#### 內容解密:
- **安裝與測試Festival**:安裝Festival並測試其語音合成功能。
- **從檔案讀取文字**:利用`text2wave`功能從指定的文字檔案中讀取文字並生成語音檔案。
### 安裝FFmpeg進行音訊轉換
由於Festival生成的語音檔案取樣率為44100 kHz,而PiFM需求的是22050 kHz取樣率,因此我們需要使用FFmpeg進行轉換。FFmpeg是一個強大且流行的多媒體轉碼工具。
1. **安裝FFmpeg**:在終端機中輸入以下命令安裝FFmpeg:
```bash
sudo apt-get install ffmpeg
```
安裝完成後即可使用FFmpeg進行音訊轉換。
#### 內容解密:
- **FFmpeg功能介紹**:FFmpeg具有強大的多媒體轉碼能力。
- **安裝FFmpeg**:透過apt-get命令安裝FFmpeg以進行取樣率轉換。
### 下一步行動
至此,我們已經完成了氣象氣球的基本搭建工作。包括GPS定位、資料儲存、無線電傳輸以及語音合成技術。接下來我們可以進一步最佳化和擴充套件這些功能以實作更多應用場景。
