作爲一名電子愛好者,自己動手製作一些簡單的硬件小設備還是非常有趣的。我之前也是發佈了《製作HackCube中的坎坎坷坷》。這次帶來的是一個簡易的頻譜儀。

說先要說一下爲什麼要製作這個小東西。

 1. 爲了裝13
 2. 爲了看一下附件2.4G頻段的信號,尤其是一些使用2.4G頻段的航模愛好者,他們使用的遙控器是2.4G的,如果在這個頻段範圍內有太多的信號,可能會造成一些不可預料的影響。
 3. 當然了爲了製作這個的最直接的原因是手上有這些模塊並且最近在研究頻譜儀,頻譜儀的價錢還是相當的貴的。製作的過程中,學習一些設備的通信的原理。比如這個裏面就有IIC和SPI兩種通信協議。

製作的材料:

 1. Arduino uno開發板一塊(我是用的是uno,當然了你也可以使用Nano等一些其他的開發板)
 2. IIC接口的OLED顯示屏一塊好像是128*64的。淘寶上面有一堆,價錢也不是很貴。我選的是藍色的,當然還有上半部分是黃色下半部分是藍色的,你想要什麼樣的你自己做決定。當然了,你也可以嘗試在一些更大的顯示設備上面顯示(TFT彩屏)
 3. 射頻模塊nRF24L01:這個小東西網上也有很多型號的,什麼郵票孔的啦,焊好排針的啦。這個也是隨你的。
 4. 其他:焊接工具,連接線,電源等

說完基本的硬件設備接下來就是軟件問題了。剛剛開始的時候我是準備使用STM32F103製作這個小東西的。但是我發現有點麻煩,因爲是寄存器入手32的,配置寄存器實在麻煩,我就想着能不能找一些已經完善的庫來開發。我這個時候腦子一熱,Arduino裏面的集成庫那個叫多啊。我就去網上查找了一些這方面的資料。結果不找不知道一找嚇一跳。網上已經有大神做出來了。那我就算啦,直接跟着他們做吧。我看了網上有不少版本。

不過都是基於Arduino的,估計是Arduino裏面有集成好的庫文件吧。

開幹

把程序燒入Arduino。就是簡簡單單的一步,還是有很多人出現問題。

首先第一點就是開發板沒選好

我太難了,我把下載好的項目文件發給別人,他們還有人問我爲什麼下載失敗。我過去一看,真的是各種問題。

第二點就是項目的文件不在一個文件夾裏面

正常情況下你直接打開IDE文件的時候IDE會自動加載需要的庫文件,但是不排除少數情況下,她找不到庫文件。

第三,系統缺少庫文件,對於我經常使用arduino來說電腦裏面很多的庫文件都是有的,如果說你在編譯的時候出現了編譯失敗,並且還告訴你缺少了什麼庫文件,那你就下載相應的庫文件吧。我這裏還是演示一下吧

要什麼庫安裝什麼庫。再不行那就去百度問問。

說完了一些錯之後我就簡單的說一下IIC和SPI的通信協議吧,至於我爲什麼用IIC的OLED,爲什麼使用SPI的射頻模塊。第一點我在網上購買射頻模塊的時候出來的都是SPI的,所以我也沒得選擇,不過OLED倒是有很多種,因爲IIC的使用的線少,所以我就選擇了使用IIC。最主要的是別人開源的裏面就使用了IIC的,我不想改代碼啦。

說一下IIC:相信很多小夥伴第一次使用IIC的時候應該是單片機開發板上面的EEPROM芯片。當時我學習51單片機的時候,STC89C51沒有IIC的專用引腳,只能使用引腳模擬IIC啦。不過這樣我感覺對IIC的協議的學習還是非常有幫助的。

一. 技術性能:

工作速率有100K和400K兩種;

支持多機通訊;

支持多主控模塊,但同一時刻只允許有一個主控;

由數據線SDA和時鐘SCL構成的串行總線;

每個電路和模塊都有唯一的地址;

每個器件可以使用獨立電源

二. 基本工作原理:

以啓動信號START來掌管總線,以停止信號STOP來釋放總線;當SCL爲高時,SDA下跳爲起始信號,上跳爲停止信號。

每次通訊以START開始,以STOP結束;

啓動信號START後緊接着發送一個地址字節,其中7位爲被控器件的地址碼,一位爲讀/寫控制位R/W,R. /W位爲0表示由主控向被控器件寫數據,R/W爲1表示由主控向被控器件讀數據;

當被控器件檢測到收到的地址與自己的地址相同時,在第9個時鐘期間反饋應答信號;

寫通訊過程:

1. 主控在檢測到總線空閒的狀況下,首先發送一個START信號掌管總線;
2. 發送一個地址字節(包括7位地址碼和一位R/W);
3. 當被控器件檢測到主控發送的地址與自己的地址相同時發送一個應答信號(ACK);
4. 主控收到ACK後開始發送第一個數據字節;
5. 被控器收到數據字節後發送一個ACK表示繼續傳送數據,發送NACK表示傳送數據結束;
6. 主控發送完全部數據後,發送一個停止位STOP,結束整個通訊並且釋放總線;

讀通訊過程:

1. 主控在檢測到總線空閒的狀況下,首先發送一個START信號掌管總線;
2. 發送一個地址字節(包括7位地址碼和一位R/W);
3. 當被控器件檢測到主控發送的地址與自己的地址相同時發送一個應答信號(ACK);
4. 主控收到ACK後釋放數據總線,開始接收第一個數據字節;
5. 主控收到數據後發送ACK表示繼續傳送數據,發送NACK表示傳送數據結束;
6. 主控發送完全部數據後,發送一個停止位STOP,結束整個通訊並且釋放總線;

四. 總線信號時序分析

1. 總線空閒狀態

SDA和SCL兩條信號線都處於高電平,即總線上所有的器件都釋放總線,兩條信號線各自的上拉電阻把電平拉高;

2. 啓動信號START

時鐘信號SCL保持高電平,數據信號SDA的電平被拉低(即負跳變)。啓動信號必須是跳變信號,而且在建立該信號前必修保證總線處於空閒狀態;

3. 停止信號STOP

時鐘信號SCL保持高電平,數據線被釋放,使得SDA返回高電平(即正跳變),停止信號也必須是跳變信號。

4. 數據傳送

SCL線呈現高電平期間,SDA線上的電平必須保持穩定,低電平表示0(此時的線電壓爲地電壓),高電平表示1(此時的電壓由元器件的VDD決定)。只有在SCL線爲低電平期間,SDA上的電平允許變化。

5. 應答信號ACK

I2C總線的數據都是以字節(8位)的方式傳送的,發送器件每發送一個字節之後,在時鐘的第9個脈衝期間釋放數據總線,由接收器發送一個ACK(把數據總線的電平拉低)來表示數據成功接收。

6. 無應答信號NACK

在時鐘的第9個脈衝期間發送器釋放數據總線,接收器不拉低數據總線表示一個NACK,NACK有兩種用途:

a. 一般表示接收器未成功接收數據字節;

b. 當接收器是主控器時,它收到最後一個字節後,應發送一個NACK信號,以通知被控發送器結束數據發送,並釋放總線,以便主控接收器發送一個停止信號STOP。

五. 尋址約定

地址的分配方法有兩種:

1. 含CPU的智能器件,地址由軟件初始化時定義,但不能與其它的器件有衝突;
2. 不含CPU的非智能器件,由廠家在器件內部固化,不可改變。

這裏的解釋還是 https://www.cnblogs.com/yan0837/articles/1202374.html

爲什麼要說這個協議呢,目前IIC的通信相對與其他一些高速的通信協議來說還是比較慢的,我看到過有人通過分析IIC最後逆向破解了一個小設備。大家如果對這方面的資料感興趣的話,可以自己去找資料看看。

不過在我們這個小項目種就會有一個問題,那就是你買回來的OLED的地址不一樣,導致你燒入程序之後不能正常工作。

很多小夥伴問我他的顯示屏爲什麼不顯示,我查來查去最後發現他買的IIC的地址和我的不一樣,只要在OLED庫文件裏面修改IIC的地址就好了。

IIC的通信我是玩過了,大概也能根據時序圖寫一個程序出來,但是SPI還是沒有嘗試過。在些這篇文章的時候我還不是很瞭解,所以我這裏也不說什麼了,怕誤導大家。

最近在研究這些代碼。

我自己的小設備借給別人玩了。所以也沒什麼照片放上來,不過我想抽空畫一個PCB。做一個簡易版。比較就算使用arduino Nano還是有點臃腫,如果有PCB的話,就可以做的非常的小巧。如果有志同道合的人願意一起搞這些東西的話,我十分開心。

所有的代碼在github上面都有。大家可以自己搜索一下。

之前的文章種寫過一個HackCube的文章,我自己也買了CC1101的射頻模塊,我準備有空自己製作一個小的設備,這個小設備就對1Ghz一下的信號進行分析,尤其是對一些固定碼的研究,雖然HackCube已經實現了相應的功能但是我還是喜歡自己研究並且開發一下。

說一下這個小設備的效果,她能在2.41G到2.51G範圍內不斷掃描,然後將有信號的頻段通過OLED顯示出來。大家不要害怕製作完了之後周圍沒有2.4G的信號源給你測試,你會發現你家的路由器也是使用2.4G的頻段。當然也有不少是5Ghz的。那你可以帶上你的小設備去戶外看看。

至於我文章中說到的關於IIC的逆向,我在國外的一些視頻網站上面看到過,大家自行查找。如果有志同道合,對硬件,和硬件安全感興趣的朋友可以留言哦。

至於這個小設備準不準,那我也不清楚,因爲我也沒有設備測量,只能提供參考吧。如果有人想打板子做的話也可以的。

*本文原創作者:LEdge1,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載

相關文章