0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于Arduino構(gòu)建的4通道實(shí)時示波器

科技觀察員 ? 來源:circuitdigest ? 作者:伊曼紐爾·奧敦拉 ? 2022-11-08 17:25 ? 次閱讀

示波器是任何電子工程師或制造商的工作臺上最重要的工具之一。它主要用于查看波形并確定施加在其輸入端的信號的電壓電平、頻率、噪聲和其他參數(shù),這些參數(shù)可能會隨時間變化。嵌入式軟件開發(fā)人員還使用它進(jìn)行代碼調(diào)試,技術(shù)人員使用它在維修期間對電子設(shè)備進(jìn)行故障排除。這些原因使示波器成為任何工程師的必備工具。唯一的問題是它們可能非常昂貴,以最低精度執(zhí)行最基本功能的示波器可能高達(dá) 45 至 100 美元,而更先進(jìn)和更高效的示波器的成本超過 150 美元。今天,我將演示如何使用Arduino和一款軟件,該軟件將使用我最喜歡的編程語言Python開發(fā),以構(gòu)建低成本的4通道Arduino示波器,該示波器能夠執(zhí)行部署一些廉價示波器的任務(wù),例如顯示波形和確定信號的電壓電平。

工作原理

這個項(xiàng)目有兩個部分;

數(shù)據(jù)轉(zhuǎn)換器

繪圖儀

示波器通常涉及施加到其輸入通道的模擬信號的視覺表示。為此,我們需要首先將信號從模擬轉(zhuǎn)換為數(shù)字,然后繪制數(shù)據(jù)。對于轉(zhuǎn)換,我們將利用Arduino使用的atmega328p微控制器上的ADC模數(shù)轉(zhuǎn)換器)將信號輸入的模擬數(shù)據(jù)轉(zhuǎn)換為數(shù)字信號。轉(zhuǎn)換后,每次的值通過UART從Arduino發(fā)送到PC,在那里,將使用python開發(fā)的繪圖儀軟件將通過繪制每個數(shù)據(jù)與時間的關(guān)系將傳入的數(shù)據(jù)流轉(zhuǎn)換為波形。

必需組件

生成此項(xiàng)目需要以下組件;

Arduino Uno(可以使用任何其他板)

面包板

10k 電阻器 (1)

LDR (1)

跳線

所需軟件

Arduino IDE

Python 庫:Pyserial、Matplotlib、Drawnow

圖表

Arduino示波器的原理圖很簡單。我們需要做的就是將要檢查的信號連接到Arduino的指定模擬引腳。但是,我們將在簡單的分壓器設(shè)置中使用LDR來生成要檢查的信號,以便生成的波形將根據(jù)LDR周圍的光強(qiáng)度描述電壓電平。

按照下面的原理圖連接組件;

poYBAGNqIH-AMaOkAAC2FqL_6us425.png

連接后,設(shè)置應(yīng)如下圖所示。

poYBAGNqIIKAIGAVAAC7wTNAn7w775.jpg

完成所有連接后,我們可以繼續(xù)編寫代碼。

ArduinoOsclloscopeCode

我們將為這兩個部分中的每一個編寫代碼。對于前面提到的繪圖儀,我們將編寫一個python腳本,通過UART和Plots接受來自Arduino的數(shù)據(jù),而對于轉(zhuǎn)換器,我們將編寫一個Arduino草圖,該草圖從ADC接收數(shù)據(jù)并將其轉(zhuǎn)換為發(fā)送到繪圖儀的電壓電平。

Python(繪圖儀)腳本

由于 python 代碼更復(fù)雜,我們將從它開始。

我們將使用幾個庫,包括;drawnow,Matplotlib和Pyserial使用前面提到的python腳本。Pyserial 允許我們創(chuàng)建一個可以通過串行端口進(jìn)行通信的 python 腳本,Matplotlib 使我們能夠從通過串行端口接收的數(shù)據(jù)生成繪圖,drawnow 為我們提供了一種實(shí)時更新繪圖的方法。

有幾種方法可以在您的 PC 上安裝這些軟件包,最簡單的是通過pip。Pip 可以通過命令行安裝在 Windows 或 Linux 機(jī)器上。PIP 與 python3 打包在一起,所以我建議您安裝 python3 并選中有關(guān)將 python 添加到路徑的框。如果您在安裝 pip 時遇到問題,請查看 Python 官方網(wǎng)站以獲取提示。

安裝 pip 后,我們現(xiàn)在可以安裝所需的其他庫。

打開Windows用戶的命令提示符,Linux用戶的終端,然后輸入以下內(nèi)容;

pip install pyserial

完成此操作后,請使用以下命令安裝 matplotlib;

pip install matplotlib

Drawnow 有時與 matplotlib 一起安裝,但可以肯定的是,運(yùn)行;

pip install drawnow

安裝完成后,我們現(xiàn)在可以編寫 python 腳本了。

我們首先導(dǎo)入代碼所需的所有庫;

import time import matplotlib.pyplot as plt from drawnow import *

import pyserial

接下來,我們創(chuàng)建并初始化將在代碼期間使用的變量。數(shù)組 val 將用于存儲從串行端口接收的數(shù)據(jù),cnt 將用于計數(shù)。每 50 個數(shù)據(jù)計數(shù)后,位置 0 處的數(shù)據(jù)將被刪除。這樣做是為了保持示波器上顯示的數(shù)據(jù)。

val = [ ] cnt = 0

接下來,我們創(chuàng)建串行端口對象,Arduino 將通過該對象與我們的 python 腳本進(jìn)行通信。確保下面指定的 COM 端口與 Arduino 板與 IDE 通信的 COM 端口相同。上面使用的115200波特率用于確保與Arduino的高速通信。為防止錯誤,還必須啟用 Arduino 串行端口才能與此波特率通信。

port = serial.Serial('COM4', 115200, timeout=0.5)

接下來,我們使用;

plt.ion()

我們需要創(chuàng)建一個函數(shù)來從收到的數(shù)據(jù)生成繪圖,創(chuàng)建我們期望的上限和最小限制,在這種情況下,基于 Arduino's ADC 的分辨率為 1023。我們還設(shè)置了標(biāo)題,標(biāo)記了每個軸并添加了圖例,以便于識別情節(jié)。

#create the figure function def makeFig(): plt.ylim(-1023,1023) plt.title('Osciloscope') plt.grid(True) plt.ylabel('ADC outputs') plt.plot(val, 'ro-', label='Channel 0') plt.legend(loc='lower right')

完成此操作后,我們現(xiàn)在準(zhǔn)備編寫主循環(huán),該循環(huán)在可用時從串行端口獲取數(shù)據(jù)并繪制它。為了與Arduino同步,python腳本將握手?jǐn)?shù)據(jù)發(fā)送到Arduino,以指示其準(zhǔn)備讀取數(shù)據(jù)。當(dāng)Arduino收到握手?jǐn)?shù)據(jù)時,它會回復(fù)來自ADC的數(shù)據(jù)。沒有這種握手,我們將無法實(shí)時繪制數(shù)據(jù)。

while (True):

port.write(b's') #handshake with Arduino

if (port.inWaiting()):# if the arduino replies

value = port.readline()# read the reply

print(value)#print so we can monitor it

number = int(value) #convert received data to integer

print('Channel 0: {0}'.format(number))

# Sleep for half a second.

time.sleep(0.01)

val.append(int(number))

drawnow(makeFig)#update plot to reflect new data input

plt.pause(.000001)

cnt = cnt+1

if(cnt>50):

val.pop(0)#keep the plot fresh by deleting the data at position 0

Arduino 代碼

第二個代碼是Arduino草圖,用于從ADC獲取表示信號的數(shù)據(jù),然后等待從繪圖儀軟件接收握手信號。一旦收到握手信號,它就會通過UART將采集的數(shù)據(jù)發(fā)送到繪圖儀軟件。

我們首先聲明將應(yīng)用信號的Arduino模擬引腳的引腳。

int sensorpin = A0;

接下來,我們初始化并開始波特率為 115200 的串行通信

void setup() {

// initialize serial communication at 115200 bits per second to match that of the python script:

Serial.begin(115200);

}

最后,voidloop() 函數(shù)處理數(shù)據(jù)的讀取,并通過串行將數(shù)據(jù)發(fā)送到繪圖儀。

void loop() {

// read the input on analog pin 0:

float sensorValue = analogRead(sensorpin);

byte data = Serial.read();

if (data == 's')

{

Serial.println(sensorValue);

delay(10); // delay in between reads for stability

}

}

完整的 Arduino 示波器代碼在下面以及本文末尾給出,如下所示。

int sensorpin = A0;

void setup() {

// initialize serial communication at 115200 bits per second to match that of the python script:

Serial.begin(115200);

}

void loop() {

// read the input on analog pin 0:########################################################

float sensorValue = analogRead(sensorpin);

byte data = Serial.read();

if (data == 's')

{

Serial.println(sensorValue);

delay(10); // delay in between reads for stability

}

}

Arduino 示波器的實(shí)際應(yīng)用

將代碼上傳到Arduino設(shè)置并運(yùn)行python腳本。您應(yīng)該看到數(shù)據(jù)開始通過python命令行流入,并且繪圖隨光強(qiáng)度而變化,如下圖所示。

pYYBAGNqIIOAHPoeAAB5Hz-4b70766.png

Python Code:





import time

import matplotlib.pyplot as plt

from drawnow import *

import serial

val = [ ]

cnt = 0

#create the serial port object

port = serial.Serial('COM4', 115200, timeout=0.5)

plt.ion()


#create the figure function

def makeFig():

plt.ylim(-1023,1023)

plt.title('Osciloscope')

plt.grid(True)

plt.ylabel('data')

plt.plot(val, 'ro-', label='Channel 0')

plt.legend(loc='lower right')


while (True):

port.write(b's') #handshake with Arduino

if (port.inWaiting()):# if the arduino replies

value = port.readline()# read the reply

print(value)#print so we can monitor it

number = int(value) #convert received data to integer

print('Channel 0: {0}'.format(number))

# Sleep for half a second.

time.sleep(0.01)

val.append(int(number))

drawnow(makeFig)#update plot to reflect new data input

plt.pause(.000001)

cnt = cnt+1

if(cnt>50):

val.pop(0)#keep the plot fresh by deleting the data at position 0





Arduino Code:


int sensorpin = A0;

void setup() {

// initialize serial communication at 115200 bits per second to match that of the python script:

Serial.begin(115200);

}

void loop() {

// read the input on analog pin 0:########################################################

float sensorValue = analogRead(sensorpin);

byte data = Serial.read();

if (data == 's')

{

Serial.println(sensorValue);

delay(10); // delay in between reads for stability

}

}


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 示波器
    +關(guān)注

    關(guān)注

    113

    文章

    6150

    瀏覽量

    184100
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

    84306
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6455

    瀏覽量

    186378
收藏 人收藏

    評論

    相關(guān)推薦

    通道示波器

    通道示波器,要的拿走
    發(fā)表于 08-26 08:46

    USB八通道示波器

    ,一般使用示波器的外觸發(fā)輸入功能和參考同步信號測量多路信號。市面上現(xiàn)能提供8通道獨(dú)立示波器的只有日本橫河(型號為DLM4038和DLM4038),但價格昂貴;而USB八通道
    發(fā)表于 08-02 10:54

    求購TO2044 數(shù)字示波器.4 GHz的4通道

    求購TO2044 數(shù)字示波器.4 GHz的4通道二手RTO2044供應(yīng)熱線:***/13728431276(同微)曾S供應(yīng)QQ:3140751627(同微)koukou:三一四零七五一
    發(fā)表于 03-08 16:51

    高性價比4通道300MHz帶寬數(shù)字示波器

    高性價比4通道300MHz帶寬數(shù)字示波器  電子市場的發(fā)展前景是毋庸置疑的,與之相輔相生的電子測量儀器、儀表設(shè)備也應(yīng)用廣泛。就數(shù)字示波器而言,最近幾年不斷有
    發(fā)表于 12-29 09:08 ?1495次閱讀
    高性價比<b class='flag-5'>4</b><b class='flag-5'>通道</b>300MHz帶寬數(shù)字<b class='flag-5'>示波器</b>

    鼎陽科技推出SDS1000CF 4通道 帶寬數(shù)字示波器

    鼎陽科技推出SDS1000CF 4通道 帶寬數(shù)字示波器  電子市場的發(fā)展前景是毋庸置疑的,與之相輔相生的電子測量儀器、儀表設(shè)備也應(yīng)用廣泛。就數(shù)字示波器而言,最近幾年
    發(fā)表于 01-09 09:52 ?1028次閱讀
    鼎陽科技推出SDS1000CF <b class='flag-5'>4</b><b class='flag-5'>通道</b> 帶寬數(shù)字<b class='flag-5'>示波器</b>

    力科推出 4通道均為30GHz的實(shí)時示波器解決方案

    力科推出 4通道均為30GHz的實(shí)時示波器解決方案 力科通過簡單和快速的連接2臺示波器的方法在4
    發(fā)表于 02-08 16:15 ?930次閱讀

    力科推出4通道均為30GHz的實(shí)時示波器解決方案

    力科推出4通道均為30GHz的實(shí)時示波器解決方案 不久前,力科通過簡單和快速的連接2臺示波器的方法在4
    發(fā)表于 02-11 08:36 ?1568次閱讀

    LabVIEW串口四通道示波器

    21ic下載_LabVIEW串口四通道示波器
    發(fā)表于 12-16 14:43 ?110次下載

    是德科技發(fā)布4通道實(shí)時功率分析儀,為三相交流設(shè)備測試提供利器

    是德科技公司(NYSE:KEYS)日前發(fā)布了新款I(lǐng)ntegraVision功率分析儀,實(shí)現(xiàn)4通道的高精度、實(shí)時的功率分析和測量。Keysight IntegraVision PA2203A 4
    發(fā)表于 12-21 16:46 ?1546次閱讀

    multisim虛擬儀器之四通道示波器

    通道示波器4ChannelOscilloscope),可以同時對4路信號進(jìn)了觀察和測量。因而在對路以上信號進(jìn)行對比觀察和測量時,更為方便。
    發(fā)表于 01-04 11:08 ?5w次閱讀
    multisim虛擬儀器之四<b class='flag-5'>通道</b><b class='flag-5'>示波器</b>

    CN0394: 帶Arduino兼容模擬接口的靈活、低功耗、4通道熱電偶系統(tǒng)

    CN0394: 帶Arduino兼容模擬接口的靈活、低功耗、4通道熱電偶系統(tǒng)
    發(fā)表于 03-19 10:48 ?6次下載
    CN0394: 帶<b class='flag-5'>Arduino</b>兼容模擬接口的靈活、低功耗、<b class='flag-5'>4</b><b class='flag-5'>通道</b>熱電偶系統(tǒng)

    示波器通道和四通道有什么區(qū)別

    示波器通道和四通道的區(qū)別是,通道越多,可比性越好,可以同時觀察更多的信號。
    發(fā)表于 10-26 14:19 ?1.6w次閱讀

    Arduino LCD觸摸屏雙通道示波器

    電子發(fā)燒友網(wǎng)站提供《Arduino LCD觸摸屏雙通道示波器.zip》資料免費(fèi)下載
    發(fā)表于 02-03 11:15 ?4次下載
    <b class='flag-5'>Arduino</b> LCD觸摸屏雙<b class='flag-5'>通道</b><b class='flag-5'>示波器</b>

    基于Arduino的雙通道示波器

    電子發(fā)燒友網(wǎng)站提供《基于Arduino的雙通道示波器.zip》資料免費(fèi)下載
    發(fā)表于 02-03 11:09 ?10次下載
    基于<b class='flag-5'>Arduino</b>的雙<b class='flag-5'>通道</b><b class='flag-5'>示波器</b>

    Arduino藍(lán)牙4通道中繼應(yīng)用程序

    電子發(fā)燒友網(wǎng)站提供《Arduino藍(lán)牙4通道中繼應(yīng)用程序.zip》資料免費(fèi)下載
    發(fā)表于 02-08 09:25 ?0次下載
    <b class='flag-5'>Arduino</b>藍(lán)牙<b class='flag-5'>4</b><b class='flag-5'>通道</b>中繼應(yīng)用程序