大家好,歡迎來到今天的帖子。成為創(chuàng)客最迷人的事情之一是知道如何開發(fā)臨時工具,當(dāng)您擁有這種多功能性時,您將永遠(yuǎn)不會陷入任何項目的工作。所以今天,我將分享如何構(gòu)建電氣/電子工程中最重要的工具之一的基于Raspberry Pi的臨時版本;示波器。
示波器是一種電子測試儀器,可以可視化和觀察變化的信號電壓,通常作為二維圖,其中一個或多個信號與時間的關(guān)系圖。今天的項目將尋求使用Raspberry Pi和模數(shù)轉(zhuǎn)換器模塊復(fù)制示波器的信號可視化功能。
項目流程:
使用 Raspberry Pi 復(fù)制示波器的信號可視化將需要以下步驟;
1. 執(zhí)行輸入信號的數(shù)字到模擬轉(zhuǎn)換
2. 準(zhǔn)備結(jié)果數(shù)據(jù)以進行表示
3. 在實時圖上繪制數(shù)據(jù)
該項目的簡化框圖如下圖所示。
項目要求
該項目的要求可分為兩類:
硬件要求
軟件要求
硬件要求
要構(gòu)建此項目,需要以下組件/部件;
樹莓派 2(或任何其他型號)
8 或 16GB SD 卡
局域網(wǎng)/以太網(wǎng)電纜
ADS1115 模數(shù)轉(zhuǎn)換器
LDR(可選,用于測試)
10k 或 1k 電阻
跳線
面包板
監(jiān)視器或任何其他查看 pi 桌面的方式(包括 VNC)
軟件要求
該項目的軟件要求基本上是用于數(shù)據(jù)可視化的python模塊(matplotlib和drawnow)和用于與ADS1115 ADC芯片接口的Adafruit模塊。在我們繼續(xù)時,我將展示如何在樹莓派上安裝這些模塊。
雖然本教程無論使用哪種樹莓派操作系統(tǒng)都可以工作,但我將使用樹莓派拉伸操作系統(tǒng),我假設(shè)您熟悉使用 Raspbian 拉伸操作系統(tǒng)設(shè)置 Raspberry Pi,并且您知道如何使用 putty 等終端軟件 SSH 進入樹莓派。如果您對此有任何問題,本網(wǎng)站上有大量的樹莓派教程可以提供幫助。
所有硬件組件就緒后,讓我們創(chuàng)建原理圖并將組件連接在一起。
電路圖:
為了將模擬輸入信號轉(zhuǎn)換為可以使用Raspberry Pi可視化的數(shù)字信號,我們將使用ADS1115 ADC芯片。該芯片變得很重要,因為Raspberry Pi與Arduino和大多數(shù)微控制器不同,沒有板載模數(shù)轉(zhuǎn)換器(ADC)。雖然我們可以使用任何兼容樹莓派的ADC芯片,但我更喜歡這款芯片,因為它的高分辨率(16位)和Adafruit的有據(jù)可查的數(shù)據(jù)表和使用說明。您還可以查看我們的樹莓派ADC教程以了解更多信息。
ADC是基于I2C的器件,應(yīng)連接到樹莓派,如下圖所示。
為清楚起見,下面還介紹了兩個元件之間的引腳連接。
ADS1115 和樹莓派連接:
VDD – 3.3V
接地 – 接地
SDA – SDA
標(biāo)準(zhǔn)及校正實驗所 – 標(biāo)準(zhǔn)及校正實驗所
完成所有連接后,啟動您的 pi 并繼續(xù)安裝下面提到的依賴項。
安裝樹莓派示波器的依賴項:
在我們開始編寫 python 腳本以從 ADC 中提取數(shù)據(jù)并將其繪制在實時圖形上之前,我們需要啟用樹莓派的I2C 通信接口并安裝前面提到的軟件要求。這將在以下步驟中完成,以便于遵循:
第 1 步:啟用樹莓派 I2C 接口
要啟用 I2C,請從終端運行;
sudo raspi-config
當(dāng)配置面板打開時,選擇接口選項,選擇 I2C,然后單擊啟用。
第 2 步:更新樹莓派
在開始任何項目之前,我要做的第一件事就是更新 Pi。通過這個,我確信操作系統(tǒng)上的每件事都是最新的,我不會遇到與我選擇在 Pi 上安裝的任何最新軟件的兼容性問題。為此,請運行以下兩個命令:
sudo apt-get update
sudo apt-get upgrade
第 3 步:為 ADC 安裝 Adafruit ADS1115 庫
更新完成后,我們現(xiàn)在準(zhǔn)備從 ADS115 芯片的 Adafruit python 模塊開始安裝依賴項。通過運行確保您位于樹莓派主目錄中;
cd ~
然后通過運行安裝構(gòu)建要素;
sudo apt-get install build-essential python-dev python-smbus git
接下來,通過運行克隆庫的 Adafruit git 文件夾;
git clone
https://github.com/adafruit/Adafruit_Python_ADS1x15.git
切換到克隆文件的目錄并運行安裝文件;
cd Adafruit_Python_ADS1x1z
sudo python setup.py install
安裝后,您的屏幕應(yīng)如下圖所示。
第 4 步:測試庫和 12C 通信。
在繼續(xù)項目的其余部分之前,測試庫并確保ADC可以通過I2C與Raspberry Pi通信非常重要。為此,我們將使用庫附帶的示例腳本。
當(dāng)仍在 Adafruit_Python_ADS1x15 文件夾中時,通過運行將目錄更改為示例目錄;
cd examples
接下來,運行 sampletest.py 示例,該示例以表格形式顯示ADC上四個通道的值。
使用以下方法運行示例:
python simpletest.py
如果啟用了I2C模塊并且連接良好,則應(yīng)看到如下圖所示的數(shù)據(jù)。
如果發(fā)生錯誤,請檢查以確保ADC與PI連接良好,并且在Pi上啟用了I2C通信。
第 5 步:安裝Matplotlib
為了可視化數(shù)據(jù),我們需要安裝 matplotlib 模塊,該模塊用于在 python 中繪制所有類型的圖形。這可以通過運行來完成;
sudo apt-get install python-matplotlib
您應(yīng)該會看到如下圖所示的結(jié)果。
第 6 步:安裝Drawnowpython 模塊
最后,我們需要安裝 drawnow python 模塊。該模塊可幫助我們提供數(shù)據(jù)圖的實時更新。
我們將通過 python 包安裝程序安裝 drawnow;pip,所以我們需要確保它已安裝。這可以通過運行來完成;
sudo apt-get install python-pip
然后,我們可以使用 pip 通過運行以下命令來安裝 drawnow 包:
sudo pip install drawnow
運行它后,您應(yīng)該得到如下圖所示的結(jié)果。
安裝完所有依賴項后,我們現(xiàn)在可以編寫代碼了。
Raspberry Pi 示波器的 Python 代碼:
這個Pi示波器的python代碼相當(dāng)簡單,特別是如果你熟悉python matplotlib模塊。在向我們展示整個代碼之前,我將嘗試將其分解為一部分并解釋代碼的每個部分在做什么,以便您有足夠的知識來擴展代碼以執(zhí)行更多操作。
在此階段,切換到顯示器或使用VNC查看器非常重要,通過它可以看到Raspberry Pi的桌面,因為正在繪制的圖形不會顯示在終端上。
以監(jiān)視器為界面打開一個新的python文件。你可以叫它任何你想要的名字,但我會稱它為 scope.py。
sudo nano scope.py
創(chuàng)建文件后,我們要做的第一件事是導(dǎo)入我們將使用的模塊;
import time
import matplotlib.pyplot as plt
from drawnow import *
import Adafruit_ADS1x15
接下來,我們創(chuàng)建一個指定 ADS1115 ADC 的 ADS1x15 庫實例
adc = Adafruit_ADS1x15.ADS1115()
接下來,我們設(shè)置ADC的增益。有不同的增益范圍,應(yīng)根據(jù)ADC輸入端的預(yù)期電壓進行選擇。在本教程中,我們估計 0 – 4.09v,因此我們將使用 1 的增益。有關(guān)增益的更多信息,請查看 ADS1015/ADS1115 數(shù)據(jù)表。
GAIN = 1
接下來,我們需要創(chuàng)建數(shù)組變量,這些變量將用于存儲要繪制的數(shù)據(jù),另一個變量用作計數(shù)。
Val = [ ]
cnt = 0
接下來,我們了解我們使繪圖具有交互性的意圖,以便我們能夠?qū)崟r繪制數(shù)據(jù)。
plt.ion()
接下來,我們開始連續(xù)ADC轉(zhuǎn)換,指定ADC通道,在本例中為通道0,我們還指定增益。
應(yīng)該注意的是,ADS1115上的所有四個ADC通道可以同時讀取,但1個通道足以進行本演示。
adc.start_adc(0, gain=GAIN)
接下來,我們創(chuàng)建一個函數(shù) def makeFig,以創(chuàng)建和設(shè)置將保存我們的實時圖的圖形的屬性。我們首先使用 ylim 設(shè)置 y 軸的極限,然后輸入繪圖的標(biāo)題和標(biāo)簽名稱,然后使用 plt.plot() 指定要繪制的數(shù)據(jù)及其繪圖樣式和顏色。我們還可以聲明通道(如通道0所示),以便在使用ADC的四個通道時識別每個信號。plt.legend 用于指定我們希望在圖上顯示有關(guān)該信號的信息(例如通道 0)的位置。
plt.ylim(-5000,5000)
plt.title('Osciloscope')
plt.grid(True)
plt.ylabel('ADC outputs')
plt.plot(val, 'ro-', label='lux')
plt.legend(loc='lower right')
接下來,我們編寫 while 循環(huán),該循環(huán)將用于不斷從 ADC 讀取數(shù)據(jù)并相應(yīng)地更新圖。
我們要做的第一件事是讀取ADC轉(zhuǎn)換值
value = adc.get_last_result()
接下來,我們在終端上打印值,只是為了給我們另一種確認(rèn)繪制數(shù)據(jù)的方法。我們在打印后等待幾秒鐘,然后將數(shù)據(jù)附加到為存儲該通道的數(shù)據(jù)而創(chuàng)建的列表 (val) 中。
print('Channel 0: {0}'.format(value))
time.sleep(0.5)
val.append(int(value))
然后我們調(diào)用 drawnow 來更新繪圖。
drawnow(makeFig)
為了確保最新數(shù)據(jù)是圖上可用的數(shù)據(jù),我們在每 50 個數(shù)據(jù)計數(shù)后刪除索引 0 處的數(shù)據(jù)。
cnt = cnt+1
if(cnt>50):
val.pop(0)
就這樣!
完整的 Python 代碼在本教程末尾給出。
樹莓派示波器的實際應(yīng)用:
復(fù)制完整的 python 代碼并粘貼到我們之前創(chuàng)建的 python 文件中,請記住我們需要一臺顯示器來查看繪圖,因此所有這些都應(yīng)該通過 VNC 或連接的顯示器或屏幕完成。
保存代碼并使用運行;
sudo python scope.py
如果您使用了 scope.py 以外的其他名稱,請不要忘記更改此名稱以匹配。
幾分鐘后,您應(yīng)該會看到終端上打印的ADC數(shù)據(jù)。有時,您可能會收到來自 matplotlib 的警告(如下圖所示),該警告應(yīng)被禁止顯示,但它不會影響正在顯示的數(shù)據(jù)或繪圖。但是,為了禁止顯示警告,可以在代碼中的導(dǎo)入行之后添加以下代碼行。
Import warnings
import matplotlib.cbook
warnings.filterwarnings(“ignore”, category=matplotlib.cbook.mplDeprecation)
這就是本教程的伙計們,要全面測試示波器,您可以將電位計等模擬設(shè)備連接到ADC上的通道,您應(yīng)該看到數(shù)據(jù)隨著電位計的每一次轉(zhuǎn)動而變化。
import time
import matplotlib.pyplot as plt
#import numpy
from drawnow import *
# Import the ADS1x15 module.
import Adafruit_ADS1x15
# Create an ADS1115 ADC (16-bit) instance.
adc = Adafruit_ADS1x15.ADS1115()
GAIN = 1
val = [ ]
cnt = 0
plt.ion()
# Start continuous ADC conversions on channel 0 using the previous gain value.
adc.start_adc(0, gain=GAIN)
print('Reading ADS1x15 channel 0')
#create the figure function
def makeFig():
plt.ylim(-5000,5000)
plt.title('Osciloscope')
plt.grid(True)
plt.ylabel('ADC outputs')
plt.plot(val, 'ro-', label='Channel 0')
plt.legend(loc='lower right')
while (True):
# Read the last ADC conversion value and print it out.
value = adc.get_last_result()
print('Channel 0: {0}'.format(value))
# Sleep for half a second.
time.sleep(0.5)
val.append(int(value))
drawnow(makeFig)
plt.pause(.000001)
cnt = cnt+1
if(cnt>50):
val.pop(0)
-
示波器
+關(guān)注
關(guān)注
113文章
6266瀏覽量
185326
發(fā)布評論請先 登錄
相關(guān)推薦
評論