遠距無線播送:Raspberry Pi慢掃描電視(SSTV)攝影機

三月 6, 2015
Facebook
Twitter

在本專題中,我用配有PiCam攝影機的Raspberry Pi做為無線攝影機,可遠距離、約百米內傳送影像。影像的傳送是由慢速掃描電視(SSTV)透過業餘無線電臺(俗稱火腿電臺)於2波段(144.5兆赫)傳輸。
感謝 Oliver MattosOskar Weigl Raspberry Pi可以自行發出高頻FM訊號,低功率傳輸時無須使用額外的電子產品。若功率須些微增加,多加上一個單電晶體或雙電晶體的放大器即可。另外,推薦使用低通濾波器以過濾高頻訊號。

此專題還包含了偵測動態物體的Python程式碼,讓Raspberry Pi做為遠超過一般WiFi網路範圍的無線監視攝影機。
請注意!你必須擁有業餘無線電執照才能只用此裝置。

以下是裝置圖示,請按照步驟進行。專題程式碼可以在我的部落格或我的GitHub網頁找到

特別感謝KI4MCW (SSTV), Oliver Mattos 以及 Oskar Weigl (PiFm)
图片

圖說:antenna 天線/Pi NoIR Camera PiNoIR攝影機/PiFace control & display PiFace控制顯示面板/Battery 電池

可攜式SSTV攝影機會拍攝影像並且經由業餘無線電臺SSTV攝影機傳送畫面。
材料

第一步:連接硬體

  • 在這個專題裡,會用到的硬體只有Raspberry PiPi NoIR攝影機、PiFace控制顯示面板和做為天線的一段電線。
  • 為達到可攜性,用牛皮膠布把一個5V USB電池組黏到Raspberry Pi外殼上。

第二步:拍攝畫面

  • 首先要做的是拍攝要傳輸的畫面,用 raspistill 指令行功能就能輕鬆達成:

raspistill -t 1 –width 320 –height 256 -e png -o /tmp/image.png

  • 針對SSTV,我們需要320×256畫素的小影像。它會以PNG影像檔格式存到 /tmp 目錄。

第三步:將影像轉換為SSTV聲音檔

  • 接著,我們要把影像轉換為可以無線傳輸的聲音檔。Raspberry Pi有一些SSTV指令可以選擇。
  • 第一個拿來測試的是PiSSTV,這是一種Python指令。它可以用,但速度非常慢,一個影像要好幾分鐘才能轉換完成。(可以參考在我的部落格上的細節。)
  • 接著我找到由 ham KI4MCW 羅伯特‧馬歇爾(Robert Marshall)所編寫的簡單的C語言指令。可惜在前導音調中有一些錯誤,但都很容易修正。我還把它改得更有彈性,可以在指令行設定聲音採樣頻率。
  • 我的指令的原始碼可以在GitHub找到。編譯原始碼:

pi@rpicamera ~/sstv $ sudo apt-get install libgd2-xpm-dev 
pi@rpicamera ~/sstv $ sudo apt-get install libmagic-dev 
pi@rpicamera ~/sstv $ gcc -lgd -lmagic -o pisstv pisstv.c

  • 執行程式:

pi@rpicamera ~/pisstv $ ./pisstv /tmp/image.png 22050 
Constants check: 
rate = 22050 
BITS = 16 
VOLPCT = 20 
scale = 6553 
us/samp = 45.351474 
2p/rate = 0.000285 
Checking filetype for file [/tmp/image.png] 
File is a PNG image. 
Input file is [/tmp/image.png]. 
Output file is [/tmp/image.png.wav]. 
Writing audio data to file. 
Got a total of [2589556] samples. 
Done writing to audio file. 
Created soundfile in 4 seconds.

  • 我們可以看到SSTV聲音檔只花了4秒鐘就建立完成。一切都很順利。下一步:無線聲音傳輸。

第四步:以PiFM傳輸聲音

图片

  • 可以加裝一個無線發射器,像可攜式無線收發器那樣,但讓Raspberry Pi自己產生高頻訊號有趣多了。這都要感謝Oliver MattosOskar WeiglPiFM軟體(可以參考我們的Raspberry Pi)。
  • 在這裡可以找到他們的程式碼。它已經有很大的進步:最初的版本很簡單,但使用了所有的CPU週期,而且訊號會受到其他程序運作時產生的假訊號干擾。最新版本使用的是DMA,運作很順暢,也不會占用所有的CPU週期。但這個程式碼現在複雜多了。
  • Oliver and Oskar有很大的貢獻,但PiFm軟體用在火腿無線電和SSTV就不適合。主要有兩個問題。首先是頻寬太大,第二個是定時問題。定時對SSTV很重要,而它有些誤差。

第五步:降低頻寬

  • 降低頻寬非常簡單。每位火腿族知道,頻寬可以藉由頻率調變的調變係數設定,和調變高頻載體的聲音訊號音量相等。在原始碼裡,它是單一個值;可以在 Outputter/class的 consume 函數找到。
  • 這是原來的程式碼:

void consume(float* data, int num) { 
for (int i=0; i<num;i++){ 
float value = data[i]*8; // modulation index (AKA volume!)

  • 我做了這個值的指令行參數。新的程式碼是這樣:

void consume(float* data, int num) { 
for (int i=0; i<num;i++){ 
float value = data[i]*modulation_index; // modulation index (AKA volume!) (original 8)

  • 可惜這樣效果不好,仍然有很強的邊帶,所以在此軟體的未來版本中還需要多加關注。
  • 第一張圖是全頻寬FM訊號的頻譜圖。
  • 第二個頻譜圖顯示降低的頻寬。調整中間的波峰後得到乾淨的訊號,但還需要清除邊帶。
  • 最後一張圖是PiFm最初版本的降低頻寬訊號,頻寬很棒,但訊號受到CPU執行其他程序時產生的干擾。

第六步:調整定時

  • PiFm的聲音傳輸採樣率稍微增加或減少時,聽者幾乎感覺不到差別,但對於SSTV就不一樣了,SSTV的定時需要很精準。
  • 稍有誤差的採樣率會造成影像傾斜,像在第一張圖所看到的。
  • 第二張圖是採樣正確的相同聲音檔。
  • 修正定時很簡單,只要修正原始碼中的定時常數。//clocksPerSample = 22500.0 / rate * 1373.5; // for timing, determined by experiment clocksPerSample = 22050.0 / rate * timing_correction; // for timing, determined by experiment
  • 這邊可以看到我用變數 timing_correction 來取代定時常數(1373.5),可以由指令行來設定。個別的Raspberry Pi會有不同的數值。在我的例子裡,數值是1414.0。我想知道適合你的設定值是多少,請在下面留言告訴我。關於其他程式碼的修改,請參考在GitHub的原始檔案。

第七步:新增呼號

  • 開始用你的火腿無線電授權傳輸SSTV訊號時,需要在每次傳輸時傳送你的呼號,所以我們要把這項資訊新增到影像裡。
  • 我們可以從指令行用 imagick或從Python影像資料庫(PIL)來完成。這個專題裡兩種都有使用。

第八步:捕捉動態

  • 現在我們可以擷取影像並用PiFm來順利傳送了,接下來我們的任務是在鏡頭前有動靜時觸發影像擷取。我把這個指令放在Python,搭配PIL。這個程式碼很簡單,它會比較前一個影像和當前影像的畫素。如果變化太大,就會傳送影像。
  • 這裡是程式碼的片段:

# loop forever while (True): 
# grab comparison image 
imgnew, bufnew = captureImage() 
# Count changed pixel 
changedPixels = 0 
for x in xrange(0, 320): 
for y in xrange(0, 256): 
# Just check red channel as it’s dominant for PiCam NoIR 
pixdiff = abs(buf[x,y][0] – bufnew[x,y][0]) 
if pixdiff > threshold: 
changedPixels += 1 
# Transmit an image if pixels changed 
if changedPixels > sensitivity: 
# Swap comparison buffers 
img = imgnew 
buf = bufnew 
transmitImage(img.copy())

  • 同樣地,完整程式碼可以在GitHub page網頁找到。在下面的留言分享你的作品吧!

Picture

GERRIT POLDER
火腿無線電和機器人專題的製作。
http://www.agri-vision.nl/



(譯:屠建明)
[原文]


Social media & sharing icons powered by UltimatelySocial