整合伺服馬達和運動感測器,透過 Python 程式碼控制雷射筆的移動,創造出能與貓互動的智慧玩具。調整伺服馬達角度及運動範圍,確保雷射在有效範圍內移動。利用運動感測器偵測貓咪靠近,觸發玩具啟動,提升互動性並節省電力。無人機軌跡記錄則運用 GPS 模組與 Raspberry Pi 的連線,配合 Python 程式碼擷取 GPS 資料並記錄至日誌檔案。後續將日誌檔案的座標資料轉換為 KML 格式,便於在 Google Earth 上視覺化無人機的飛行軌跡,實作軌跡追蹤和分析。
講解與指引:玄貓智慧貓玩具的建造過程
在建造這款智慧貓玩具時,有幾個關鍵步驟需要特別注意。這些步驟包括如何調整雷射筆及其伺服馬達的位置、連線運動感測器、以及最終組裝所有元件。以下是詳細的講解與指引。
使用雷射筆及其相關伺服馬達的調整
首先,必須仔細調整雷射筆及其相關伺服馬達的位置,確保雷射筆在所有運動範圍內都能自由旋轉。最簡單的方法是將伺服馬達的螺絲旋下,並根據伺服馬達的運動範圍重新調整伺服馬達的角度。接著,將兩個伺服馬達執行至所有可能的位置,確保機械不會在任何運動過程中卡住。由於標準伺服馬達僅能執行約180度,應該能找到適合所有部件的合適位置。
連線運動感測器
運動感測器不僅能節省電池電量,還能大幅提升玩具的酷炫程度:當貓咪(或其他動物)靠近時,玩具才會啟動。以下是連線運動感測器的詳細步驟:
應用原理
首先,瞭解一下感測器和 GPIO 的基本原理。運作原理如下:
- 運動感測器:當感測到運動時,輸出一個高電平訊號(HIGH)。
- GPIO 設定:將 GPIO 針腳設定為輸入模式,並使用下拉電阻(PULL DOWN),當沒有感測到運動時,輸入為低電平(LOW)。
這樣設計目的是讓我們可以精確地知道何時有運動發生,進而啟動控制玩具的 Python 指令碼。
電路連線
- 電源連線:將運動感測器的正負極連線到電源。
- 輸出連線:將第三個針腳(最左側針腳)連線到 Raspberry Pi 的 GPIO 針腳(設定為輸入模式)。
Python 語法範例
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False) # 取消警告訊息
GPIO.setmode(GPIO.BOARD) # 設定GPIO模式為BOARD模式
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) # 設定GPIO 11為輸入模式並設定下拉電阻
GPIO.setup(13, GPIO.OUT) # 設定GPIO 13為輸出模式
while True:
if GPIO.input(11): # 若檢測到運動
GPIO.output(13, 1) # 點亮LED
else:
GPIO.output(13, 0) # 應未檢測到運動則熄滅LED
檢查與測試
按照上述程式碼進行測試:
- 按照圖示連線各個元件。
- 輸入程式碼並執行。
- 若LED在運動感測器前移動時亮起,則表示成功。
完整組裝與連線所有元件
電源管理
- 電池選擇:兩個伺服馬達使用9V電池供電。
- Raspberry Pi 電源:使用獨立電源供應。
元件連線
使用麵包板來管理所有電源和地線的連線。具體步驟如下:
- 地線連線:將所有地線(GND)連線到麵包板共同地線上。
- 電源分配:將9V電池正極連線到麵包板一個正極通道,Raspberry Pi正極通道連線另一個正極通道。
- 元件供電:雷射筆、IR感測器分別與Raspberry Pi正極通道相連,兩個伺服馬達則與9V正極通道相連。
此圖示說明瞭元件之間的最終連線方式:
graph LR;
A[9V 電池] --> B[麵包板]
C[Raspberry Pi] --> B[麵包板]
D[雷射筆] --> B[麵包板]
E[IR 感測器] --> B[麵包板]
F[第一個伺服馬達] --> B[麵包板]
G[第二個伺服馬達] --> B[麵包板]
H[共同地線] --> B[麵包板]
動手製作與機械部分
雷射筆固定
雷射筆需要固定在伺服馬達上,這裡建議使用焊錯方法來確保牢固性:
- 準備材料:沙紙、鑽孔工具、焊錯機。
- 操作步驟:用沙紙打磨雷射筆外殼和螺絲頭部,增加摩擦力;若有空間可鑽一小孔放置正極導線;最後焊錯導線至螺絲和外殼上。
外殼設計與保護
最後一步是製作外殼來保護內部機械結構:
- 選材:可以考慮使用PVC管作為外殼材料。
- 設計步驟:將底部伺服馬達固定在PVC管邊緣上;內部放置雷射筆和其他導線;在側面開洞放置IR感測器。
- Raspberry Pi放置:因體積較大,可獨立放置於另外一個盒子內,並用長導線與主結構相連。
完成後應該能看到一款像是圖9-11所示的貓玩具。希望這些指引能幫助你成功製作出這款智慧貓玩具。
用 Raspberry Pi 和 GPS 控制遙控飛機
在這篇文章中,玄貓將引導你如何利用 Raspberry Pi 和 GPS 控制一架遙控飛機,並記錄飛行軌跡。這個專案不僅能讓你體驗飛行的樂趣,還能幫助你學習一些高階的程式設計概念,例如多執行緒和麵向物件的程式設計(OOP)。
所需硬體
- Raspberry Pi(搭配攝影機)
- GPS 接收器(建議使用 Adafruit GPS 模組)
- 可選擇的 GPS 接收器天線(Adafruit 天線)
- 中型遙控飛機
- 遙控飛機電池和 5V 調壓器(用來給 Pi供電)
搭建環境
首先,我們需要建立一個專案目錄來存放我們的程式碼:
mkdir plane
cd plane
接著,我們將 Raspberry Pi 與 GPS 接收器連線起來。
連線 GPS 接收器
要讓 Raspberry Pi 能夠與 GPS 接收器溝通,我們需要使用 Python 的 gpsd 函式庫,並透過 UART (通用非同步收發傳輸器)介面進行連線。以下是連線步驟:
安裝所需的軟體:
sudo apt-get install gpsd gpsd-clients python-gps組態 UART 介面:
先備份
/boot/cmdline.txt:sudo cp /boot/cmdline.txt /boot/cmdlinecopy.txt編輯
/boot/cmdline.txt,刪除以下部分:console=ttyAMA0,115200 kgdboc=ttyAMA0,115200編輯
/etc/inittab,將最後一行加上註解:#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
重新啟動 Raspberry Pi:
sudo shutdown –r now連線 GPS 接收器:
- VIN 連線到 Pi 的 5V (pin #2)
- GND 連線到 Pi 的 pin #6
- Tx 連線到 Pi 的 Rx (pin #10)
- Rx 連線到 Pi 的 Tx (pin #8)
測試 GPS 接收器
當接收器的 LED 需要閃爍時,表示已經通電。我們可以透過啟動 gpsd 程式來測試:
sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock
然後啟動一般 GPS 應用程式:
cgps -s
如果一切正常,你應該能夠看到類別似於圖 10-2 的顯示畫面。
主要程式碼
以下是主要程式碼 plane.py 的部分內容。這段程式碼將設定 GPIO 輸出腳位、初始化隨機數生成器、並使用多執行緒來處理 GPS 資料和攝影機拍攝。
import RPi.GPIO as GPIO
import time
import random
from threading import Thread
# 初始化 GPIO 腳位
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# 初始化隨機數生成器種子
random.seed()
# 建立多執行緒函式來處理 GPS 資料和攝影機拍攝
def start_gps():
import gpsd
gpsd.connect()
while True:
packet = gpsd.get_current()
if packet.mode >= 2:
print("Latitude: ", packet.lat, "Longitude: ", packet.lon)
time.sleep(1)
def start_camera():
from picamera import PiCamera
camera = PiCamera()
while True:
camera.capture('/home/pi/images/image_%d.jpg' % random.randint(1, 100))
time.sleep(5)
# 建立並啟動多執行緒
gps_thread = Thread(target=start_gps)
camera_thread = Thread(target=start_camera)
gps_thread.start()
camera_thread.start()
# 主迴圈中等待多執行緒完成工作(理論上會無限迴圈)
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("程式已中斷")
finally:
GPIO.cleanup()
內容解密:
- GPS 資料處理:利用
gpsd函式庫來連線和讀取 GPS 資料。當 GPS 模組進入定位模式時,會印出緯度和經度。 - 攝影機拍攝:使用
picamera函式庫來控制 Raspberry Pi 的攝影機。每隔五秒鐘會拍攝一張照片並儲存在指定路徑。 - 多執行緒:使用 Python 的
threading模組來建立多執行緒,分別處理 GPS 資料和攝影機拍攝任務。
檔案解析與顯示
在飛行結束後,我們需要將記錄的座標資料解析為 KML 檔案,並上傳到 Google Earth 中顯示。以下是解析資料的程式碼範例。
import xml.etree.ElementTree as ET
def parse_gps_data(filename):
with open(filename, 'r') as file:
lines = file.readlines()
kml_root = ET.Element("kml", xmlns="http://www.opengis.net/kml/2.2")
document = ET.SubElement(kml_root, "Document")
for line in lines:
if line.startswith("$GPGGA"):
parts = line.split(',')
lat = float(parts[2])
lon = float(parts[4])
point = ET.SubElement(document, "Placemark")
coordinates = ET.SubElement(point, "Point")
coord = ET.SubElement(coordinates, "coordinates")
coord.text = f"{lon},{lat},0"
tree = ET.ElementTree(kml_root)
tree.write("flight_path.kml")
parse_gps_data("gps_data.log")
內容解密:
- XML 元素生成:利用
xml.etree.ElementTree模組來生成 KML 檔案結構。 - 座標解析:從記錄的 GPS 資料中提取緯度和經度,並將其寫入 KML 檔案。
- KML 檔案寫入:最終生成的 KML 檔案可以在 Google Earth 中顯示飛行軌跡。
流程圖示
此圖示展示了整個系統架構及其各元件之間的關係。
graph TD;
A[Raspberry Pi] --> B[GPS 接收器];
A --> C[攝影機];
B --> D{GPS 資料處理};
C --> E{照片拍攝};
D --> F{KML 檔案生成};
探索無人機技術:GPS 定位與日誌記錄
在現代無人機技術中,GPS 定位系統是不可或缺的一部分。透過 GPS,無人機可以精確定位自身位置,這對於飛行路徑規劃和安全傳回都是至關重要的。本文將探討如何利用 Raspberry Pi 和 GPS 模組來記錄無人機的飛行軌跡,並將這些資料以 KML 格式呈現在 Google Earth 中。
GPS 模組的設定與測試
首先,我們需要確保 GPS 模組正常工作並且能夠與 Raspberry Pi 進行有效通訊。當你看到的資料全是零時,這意味著 GPS 模組無法取得衛星訊號。這時候,你可能需要等待幾分鐘,甚至給 GPS 模組一個清晰的天空視野。根據我的經驗,這個特定的 GPS 模組即使沒有選擇性天線,也非常敏感。當我加裝了天線後,即使在室內也能輕鬆接收到 GPS 訊號。
使用 Python 處理 GPS 資料
一旦確認 GPS 模組正常工作並且能夠與 Raspberry Pi 進行通訊,我們就需要將這些資料格式化,以便在日誌檔案中使用。雖然我們在此使用的通用客戶端 cgps 對於檢視座標非常有用,但從中取得可用資訊卻相當困難。因此,我們將使用 Python 的 gps 模組來與接收器進行互動。
使用 Python 的 gps 模組
Python 的 gps 模組允許我們與多種不同的 GPS 接收器進行通訊,而不僅僅是我們在這個專案中使用的那一款。大多數接收器都會輸出 NMEA 格式的資料流,這與我們使用的晶片所輸出的格式相同。
import gps
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)
內容解密:
以上程式碼展示瞭如何使用 Python 的 gps 模組來初始化 GPS 資料流。首先,我們匯入 gps 模組,然後建立一個名為 session 的 GPS 會話物件,連線到本地主機和埠號 2947。接著,我們設定資料流來啟用新風格的觀察模式。
日誌檔案的設定
當我們從 GPS 接收到資料流後,需要有一個地方來儲存這些資料以便日後使用。如果我們只是在飛行時將資料列印到螢幕上(假設螢幕未連線),那麼這些資料對我們並沒有太大幫助。因此,我們可以使用 Python 的 logging 模組來設定一個日誌檔案。當 Raspberry Pi 回到地面後,我們可以解析這個檔案並將其轉換成 Google Earth 可以使用的格式。
日誌檔案的基本設定
設定日誌檔案非常簡單。以下是基本步驟:
import logging
logging.basicConfig(filename='locations.log', level=logging.DEBUG, format='%(message)s')
內容解密:
以上程式碼展示瞭如何設定日誌檔案。首先,我們匯入 logging 模組,然後使用 basicConfig 函式來組態日誌檔案的基本設定。這裡我們指定日誌檔案的名稱為 locations.log,日誌級別為 DEBUG,並且每條日誌訊息的格式為 %(message)s。
傳輸 GPS 資料到日誌檔案
接下來,我們需要將 GPS 資料寫入日誌檔案中。以下是具體步驟:
def log_gps_data(longitude, latitude, altitude):
logging.info(f"{longitude} {latitude} {altitude}")
內容解密:
以上程式碼展示瞭如何將 GPS 資料寫入日誌檔案。首先,我們定義了一個名為 log_gps_data 的函式,該函式接受三個引數:經度、緯度和高度。然後,我們使用 logging.info 函式來將這些資料寫入日誌檔案中。每次呼叫 log_gps_data 函式時,它都會在新的一行中記錄一條日誌訊息。
KML 檔案的格式化
KML 檔案是一種特殊的 XML 檔案格式,被 Google Earth 用來標示地標、物件甚至路徑。它看起來類別似於 HTML 檔案,具有開放和關閉標籤 < > 用於不同級別的資訊。一旦我們獲得了來自 GPS 的日誌檔案後,就需要將其中包含的座標格式化成 Google Earth 能夠識別的 KML 檔案。
KML 檔案範例
以下是 KML 檔案的基本結構:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Flight Path</name>
<description>A path representing the flight of the plane.</description>
<Placemark>
<LineString>
<coordinates>
</coordinates>
</LineString>
</Placemark>
</Document>
</kml>
內容解密:
以上 XML 是 KML 檔案的基本結構範例。它以 <kml> 元素開始,並在其中包含了一個 <Document> 元素。<Document> 元素內部包含了一個 <Placemark> 元素和一個 <LineString> 元素。<LineString> 元素內部包含了 <coordinates> 元素和一些其他元素。
此圖示展示了 KML 檔案中的基本結構:
graph TD;
A[KML] --> B[Document];
B --> C[Placemark];
B --> D[Style];
C --> E[LineString];
E --> F[coordinates];
與 Google Earth 整合
當無人機飛行過程中每隔30秒記錄一次GPS位置並拍照時, 無人機會記錄一系列時間點上的資料點, 用KML的路徑功能可以生成飛行軌躚圖, 在Google Earth上即可視覺化飛行路徑, 如下圖所示:
##### 飛行軌躚圖
此圖示展示了KML檔案在Google Earth上的飛行軌躚圖:
graph TD;
A[Google Earth] --> B[KML File];
B --> C[Flight Path];
C --> D[Waypoints];
C --> E[Temporal Data Points];
延伸閱讀
Python 的 logging 模組提供了豐富的功能來處理不同嚴重程度的事件記錄。根據事件嚴重程度可以設定不同等級 : DEBUG , INFO , WARNING , ERROR 和 CRITICAL 。詳細資訊請參考Python官方檔案: Python Logging HOWTO。
透過以上步驟和程式碼範例, 無人機技術愛好者可以輕鬆地記錄無人機飛行軌躚並視覺化在Google Earth上, 提升飛行安全性與分析能力。 希望你能夠從中受益, 輕鬆完成你自己的無人機專案!
