陳凱
用手機如何相互通信?這看上去是一個簡單到無聊的問題,用手機當(dāng)然可以打電話,發(fā)短信,而智能手機則提供了更多種類的軟件,通過無線網(wǎng)絡(luò)相互傳遞信息。不過,這篇文章是講要用手機來收發(fā)“電報”,之所以“電報”這個詞要打上引號,是因為通信中雖然使用到摩爾斯碼,但并不是用真正的長波無線電來發(fā)送接收信號,而是借助光、聲音、磁場等介質(zhì)來傳遞信號。這個看似復(fù)古的綜合性任務(wù),實際上涉及到信息編碼解碼、通信協(xié)議、傳感器信號接收放大等多方面的知識和技能。
入門任務(wù):光信號收發(fā)摩爾斯碼
一般智能手機攝像頭旁都自帶作為閃光燈的LED,可以利用LED光的閃爍,來發(fā)送摩爾斯碼。手機軟件收發(fā)摩爾斯碼的工作原理很簡單,發(fā)送方將符號轉(zhuǎn)換為摩爾斯碼的長信號和短信號的組合,并對應(yīng)長短時間亮起閃光燈LED,比如,字母“g”就是兩次長亮,一次短亮,而接收方則將接收到的光線強度的變化轉(zhuǎn)換回摩爾斯碼。
有許多軟件可以實現(xiàn)這樣的功能,比如,安卓手機可以下載安裝MorseLight軟件(如圖1),這個軟件提供了兩種發(fā)送摩爾斯碼的方式,一是直接用手指點擊屏幕控制閃光燈點亮的長短來發(fā)送摩爾斯碼信號,二是由用戶輸入英文單詞,軟件自動將字母或數(shù)字轉(zhuǎn)換成摩爾斯碼,然后再將摩爾斯碼轉(zhuǎn)換成長短結(jié)合的光,通過閃光燈LED發(fā)送信號。MorseLight軟件的光信號頻率很低,即便是電報菜鳥也可以很清楚地對照摩爾斯電碼表識別出閃光所對應(yīng)的符號。
相比Morse-Light,軟件Morse Code Agent(如圖2)更像是具有實用功能的通信工具,不僅可以通過閃光,還可以通過聲音來發(fā)送摩爾斯碼,接收方用攝像頭或麥克風(fēng)來接收信號。兩個手機都裝上軟件并設(shè)定好傳輸速率后,就能相互通信了。
在安靜環(huán)境中用聲音來傳遞信號,比較穩(wěn)定的傳輸速度可以達到每分鐘100個符號。用光傳輸信號受外界環(huán)境、閃光燈速度等影響較多,比較穩(wěn)定的傳輸速度大約是每分鐘20多個符號。
中級任務(wù):光信號接收摩爾斯碼的程序代碼實現(xiàn)
比起用現(xiàn)成的軟件收發(fā)電報這樣的體驗任務(wù),自己親手編寫代碼來實現(xiàn)光信號和摩爾斯碼轉(zhuǎn)換則更有挑戰(zhàn)性。有很多程序語言工具可以實現(xiàn)這一任務(wù),但是用攝像頭接收閃光并分析攝像頭圖像,代碼相當(dāng)復(fù)雜。然而筆者發(fā)現(xiàn),可以從光傳感器接收光的強弱變化,雖然傳輸距離比較近,但實現(xiàn)過程要容易很多。運行在安卓系統(tǒng)上的QPython引擎可以非常方便地調(diào)用手機各傳感器數(shù)據(jù),所以可以用QPython將光傳感器所接收到的光的強弱轉(zhuǎn)換成摩爾斯碼。程序代碼(如圖3)調(diào)用了安卓腳本層(SL4A),用一個名為mydata的列表來存儲光的強弱數(shù)值,用一個名為morse的列表來存儲轉(zhuǎn)換后的摩爾斯碼,t1變量用來計算強光維持的時間,t2變量用來計算弱光維持的時間。限于篇幅,本文提供的代碼功能簡單明確,每次運行只轉(zhuǎn)換一個符號,持續(xù)15秒未收到強光信號則表示傳輸結(jié)束。有興趣的讀者可以自己擴充代碼,實現(xiàn)連續(xù)接收并轉(zhuǎn)換多個符號的功能。
因為QPython功能有限,很難獲取到使用手機閃光燈的權(quán)限,若要編寫由摩爾斯碼轉(zhuǎn)換成長短閃光的代碼,那就需要用到Android Studio來獲取閃光燈權(quán)限,Android Studio功能完整,但是安裝、配置以及程序代碼的編寫都很費功夫。但是,可以另辟蹊徑,通過控制手機屏幕發(fā)出的光的強度,來發(fā)送出摩爾斯碼信號,除了傳遞信號的距離要短于閃光燈,其他效果是類似的。但怎么控制屏幕發(fā)出光的強度呢,有一個方法簡單到不容易被想到,那就是在手機屏幕上打滿字符,如圖4所示。
由于QPython的執(zhí)行界面默認(rèn)是黑色背景白色字符,所以,在屏幕上打印滿屏字符,就能很大程度地提高屏幕的亮度,而打印滿屏的空格,則顯示黑色背景,代碼中之所以打印“M”,是因為這個符號占用的像素比較多,更容易提高屏幕亮度。很容易編寫出根據(jù)預(yù)定持續(xù)時間交替打印滿屏字符和滿屏空格的代碼,本文展示的代碼,實際要傳輸?shù)姆柺亲帜浮癎”。當(dāng)然,也很容易繼續(xù)擴充代碼,讓計算機根據(jù)用戶輸入的字符,自動轉(zhuǎn)換為莫爾斯碼,用全屏打字的方法將信息傳遞出去。
高級任務(wù):較長距離無線電摩爾斯碼收發(fā)裝置
在上述任務(wù)中,雖然用自己編寫的代碼實現(xiàn)了兩個手機利用閃光長短發(fā)送和接收信息的功能,但能夠穩(wěn)定傳輸信息的距離是十分有限的。特定頻率段的無線電可以使信號傳遞距離更長,傳輸質(zhì)量更穩(wěn)定??梢匝永m(xù)上一節(jié)任務(wù)的思路,繼續(xù)優(yōu)化這個摩爾斯碼收發(fā)系統(tǒng)。
如圖5所示,為了實現(xiàn)較長距離的信號發(fā)射和接收,可使用27M或其他頻率的兩通無線電遙控收發(fā)模塊。發(fā)射模塊紅色導(dǎo)線接電池正極,黑色導(dǎo)線接電池負(fù)極,模塊中有兩個信號發(fā)送按鈕,在本文項目中只要使用到一個就可以了。接收模塊除了連接電池正負(fù)極的導(dǎo)線,還有兩根信號線,在本文項目中,也只要用到其中一根信號線就可以了。標(biāo)注ANT的焊點,是用來連接天線的,最簡單的天線,可以用一根比較長的導(dǎo)線來充當(dāng)。
接收模塊將無線電信號轉(zhuǎn)換為電壓信號,可以用這個電壓信號控制繼電器的合攏與斷開,來還原出電報中“有信號”和“無信號”兩種狀態(tài)。
手機信號生成并轉(zhuǎn)換為無線電信號的裝置實現(xiàn)起來比較復(fù)雜,這里只給出基本的實現(xiàn)思路,可以用光敏電阻接收手機發(fā)出的光信號,光信號的強弱變化改變光敏電阻的阻值,光亮則電阻小,反之則電阻大,然后結(jié)合偏置電阻改變?nèi)龢O管基極電壓并使得電流大小發(fā)生變化,利用電流大小變化控制繼電器的斷開與閉合,并由此控制無線電發(fā)射模塊是否產(chǎn)生信號。
但信號的接收裝置實現(xiàn)起來要簡單很多,所以,做一套人工發(fā)報——手機自動收報的系統(tǒng)還是比較容易的,完成任務(wù)的關(guān)鍵,是將接收模塊收到的無線電信號傳遞到手機中。
這里大致說明一下接收電路的工作原理,最左側(cè)的信號發(fā)生器用來模擬無線電接收模塊收到無線電信號后轉(zhuǎn)發(fā)出的電壓變化信號,這個信號被傳遞到了三極管的基極,由此改變了三極管集電極流向發(fā)射極的電流的大小。如圖6所示,當(dāng)電流變大時,繼電器合攏,燈被點亮,電流變小時,繼電器斷開,燈熄滅。這樣,就可以將遠(yuǎn)處傳來的無線電信號轉(zhuǎn)換成光信號,再通過手機的光傳感器接收光的強弱變化并將之轉(zhuǎn)換為摩爾斯碼。
當(dāng)然,也可以在繼電器后接一個有源蜂鳴器,將無線電信號轉(zhuǎn)換成聲音信號,還可以干脆直接將無線電信號轉(zhuǎn)換成磁信號(如圖7),因為繼電器自帶的線圈其實就起到了電磁鐵的作用,所以只要將手機靠近繼電器,就能感應(yīng)到磁場的改變,這樣一來,外部電路就可以得到大幅簡化。在QPython中,通過sensorsReadMagnetometer()函數(shù)可以非常輕松地捕捉到磁場改變數(shù)值(將先前獲取光強度數(shù)值的程序代碼s=droid.sensorsGetLight().result改成s=droid.sensorsReadMagnetometer().result即可),然后,將改變的磁場值與默認(rèn)的磁場值做對比,就能獲取到莫爾斯碼長短不同的兩種信號了。
這個“電報”裝置的傳輸距離可以達到幾十米遠(yuǎn),怎么樣,大家試著做起來吧!
對此期主題有任何好主意或建議,請發(fā)送稿件至kaikai_rabbit@sina.com(專欄作者)或tougao4@chinaitedu.cn(雜志社)。