오실로스코프는 전자 엔지니어 또는 제조업체의 작업대에서 찾을 수있는 가장 중요한 도구 중 하나입니다. 주로 파형을보고 시간이 지남에 따라 변경 될 수있는 입력에 적용된 신호의 전압 레벨, 주파수, 노이즈 및 기타 매개 변수를 결정하는 데 사용됩니다. 또한 임베디드 소프트웨어 개발자가 코드 디버깅을 위해 사용하고 기술자는 수리 중 전자 장치 문제를 해결하는 데 사용합니다. 이러한 이유로 오실로스코프는 모든 엔지니어에게 필수 도구가되었습니다. 유일한 문제는 매우 비쌀 수 있다는 것입니다. 가장 기본적인 기능을 최소한의 정확도로 수행하는 오실로스코프는 $ 45 ~ $ 100 정도의 비용이들 수 있으며, 더 고급스럽고 효율적인 제품은 $ 150 이상입니다. 오늘은 아두 이노 사용법을 시연하겠습니다.그리고 제가 가장 좋아하는 프로그래밍 언어 인 Python으로 개발 될 소프트웨어 는 저렴한 비용의 4 채널 Arduino 오실로스코프 를 구축하여 파형 표시 및 전압 레벨 결정과 같이 값싼 오실로스코프가 배포되는 작업을 수행 할 수 있습니다. 신호용.
작동 원리
이 프로젝트에는 두 부분이 있습니다.
- 데이터 변환기
- 플로터
오실로스코프에는 일반적으로 입력 채널에 적용된 아날로그 신호의 시각적 표현이 포함됩니다. 이를 위해서는 먼저 신호를 아날로그에서 디지털로 변환 한 다음 데이터를 플로팅해야합니다. 변환 을 위해 Arduino에서 사용하는 atmega328p 마이크로 컨트롤러 의 ADC (아날로그-디지털 변환기) 를 활용 하여 신호 입력의 아날로그 데이터를 디지털 신호로 변환합니다. 변환 후 시간당 값은 Arduino에서 PC로 UART를 통해 전송되며, 여기서 Python을 사용하여 개발 될 플로터 소프트웨어 는 각 데이터를 시간에 대해 플로팅하여 들어오는 데이터 스트림을 파형으로 변환합니다.
필수 구성 요소
이 프로젝트를 빌드하려면 다음 구성 요소가 필요합니다.
- Arduino Uno (다른 모든 보드를 사용할 수 있음)
- 브레드 보드
- 10k 저항기 (1)
- LDR (1)
- 점퍼 와이어
필수 소프트웨어
- Arduino IDE
- 파이썬
- Python 라이브러리: Pyserial, Matplotlib, Drawnow
회로도
Arduino 오실로스코프 의 회로도 는 간단합니다. 우리가해야 할 일은 검사 할 신호를 Arduino의 지정된 아날로그 핀에 연결하는 것뿐입니다. 그러나 간단한 전압 분배기 설정에서 LDR 을 사용하여 검사 할 신호를 생성하여 생성 된 파형이 LDR 주변의 빛의 강도를 기반으로 전압 레벨을 설명합니다.
아래 회로도에 표시된대로 구성 요소를 연결합니다.
연결 후 설정은 아래 이미지와 같아야합니다.
연결이 모두 완료되면 코드 작성을 진행할 수 있습니다.
Arduino 오실로스코프 코드
두 섹션 각각에 대한 코드를 작성합니다. 앞서 언급 한 플로터의 경우 UART 및 Plots를 통해 Arduino의 데이터를 받아들이는 Python 스크립트를 작성 하고 변환기의 경우 ADC에서 데이터를 가져 와서 변환 하는 Arduino 스케치를 작성합니다. 플로터로 전송되는 전압 레벨.
Python (플로터) 스크립트
파이썬 코드는 더 복잡하기 때문에 시작하겠습니다.
다음을 포함한 두 개의 라이브러리를 사용할 것입니다. drawnow, Matplotlib 및 Pyserial 은 앞에서 언급했듯이 python 스크립트를 사용합니다. Pyserial을 사용하면 직렬 포트를 통해 통신 할 수있는 python 스크립트를 만들 수 있으며, Matplotlib 는 직렬 포트를 통해 수신 된 데이터에서 플롯을 생성 할 수있는 기능을 제공 하며 drawnow 는 실시간으로 플롯을 업데이트 할 수있는 수단을 제공합니다.
이 패키지를 PC에 설치하는 방법에는 여러 가지가 있으며 가장 쉬운 방법은 pip 입니다. Pip은 Windows 또는 Linux 시스템에서 명령 줄을 통해 설치할 수 있습니다. PIP는 python3에 패키지되어 있으므로 python3을 설치하고 경로에 python을 추가하는 방법에 대한 확인란을 선택하는 것이 좋습니다. pip 설치에 문제가있는 경우 공식 Python 웹 사이트에서 팁을 확인하십시오.
pip installed를 사용하면 이제 필요한 다른 라이브러리를 설치할 수 있습니다.
Windows 사용자의 경우 명령 프롬프트, Linux 사용자의 경우 터미널을 열고 다음을 입력하십시오.
pip 설치 pyserial
이 작업이 완료되면 다음을 사용하여 matplotlib 를 설치하십시오.
pip 설치 matplotlib
Drawnow 는 때때로 matplotlib와 함께 설치되지만 확실하게 실행하십시오.
pip 설치 drawnow
설치가 완료되면 이제 파이썬 스크립트를 작성할 준비가되었습니다.
이 프로젝트의 python 스크립트는 내가 Raspberry Pi 기반 오실로스코프 용으로 작성한 스크립트와 유사합니다.
코드에 필요한 모든 라이브러리를 가져 오는 것으로 시작합니다.
import 시간 import matplotlib.pyplot as plt from drawnow import * import pyserial
다음으로, 코드에서 사용할 변수를 만들고 초기화합니다. 어레이 val 은 직렬 포트에서받은 데이터를 저장하는 데 사용되며 cnt 는 계산에 사용됩니다. 위치 0의 데이터는 50 개 데이터 카운트 후 삭제됩니다. 이것은 오실로스코프에 데이터가 계속 표시되도록하기 위해 수행됩니다.
발 = cnt = 0
다음으로 Arduino가 Python 스크립트와 통신하는 직렬 포트 개체 를 만듭니다. 아래에 지정된 com 포트가 Arduino 보드가 IDE와 통신하는 데 사용하는 동일한 com 포트인지 확인합니다. 위에서 사용 된 115200 전송 속도는 Arduino와의 고속 통신을 보장하는 데 사용되었습니다. 오류를 방지하려면 Arduino 직렬 포트도이 전송 속도와 통신하도록 활성화되어야합니다.
포트 = serial.Serial ('COM4', 115200, 시간 초과 = 0.5)
다음으로 다음을 사용하여 플롯을 대화식으로 만듭니다.
plt.ion ()
수신 된 데이터에서 플롯 을 생성 하는 함수를 생성하여 우리가 예상하는 상한 및 최소 한계를 생성해야합니다.이 경우 Arduino의 ADC 해상도를 기반으로하는 1023입니다. 또한 제목을 설정하고 각 축에 레이블을 지정하고 범례를 추가하여 플롯을 쉽게 식별 할 수 있도록합니다.
#Figure 함수 생성 def makeFig (): plt.ylim (-1023,1023) plt.title ('Osciloscope') plt.grid (True) plt.ylabel ('ADC outputs') plt.plot (val, 'ro - ', label ='채널 0 ') plt.legend (loc ='오른쪽 아래 ')
이 작업이 완료되면 이제 직렬 포트에서 데이터를 가져 와서 플로팅 하는 메인 루프 를 작성할 준비가되었습니다. Arduino와 동기화하기 위해 Python 스크립트 에서 데이터를 읽을 준비가되었음을 나타내는 핸드 셰이크 데이터가 Arduino로 전송됩니다. Arduino가 핸드 셰이크 데이터를 수신하면 ADC의 데이터로 응답합니다. 이 핸드 셰이크가 없으면 실시간으로 데이터를 그릴 수 없습니다.
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) # 수신 된 데이터를 정수로 변환 print ('Channel 0: {0}'. format (number)) # 0.5 초 동안 수면. time.sleep (0.01) val.append (int (number)) drawnow (makeFig) # 새로운 데이터 입력을 반영하도록 플롯 업데이트 plt.pause (.000001 ) cnt = cnt + 1 if (cnt> 50): val.pop (0) # 위치 0에서 데이터를 삭제하여 플롯을 최신 상태로 유지
아두 이노 오실로스코프에 대한 완전한 파이썬 코드는 다음과 같이이 문서의 끝 부분에 제공됩니다.
Arduino 코드
두 번째 코드는 Arduino 스케치로 ADC에서 신호를 나타내는 데이터를 얻은 다음 플로터 소프트웨어에서 핸드 셰이크 신호를받을 때까지 기다립니다. 핸드 셰이크 신호를 수신하자마자 수집 된 데이터를 UART를 통해 플로터 소프트웨어로 보냅니다.
우리는 아두 이노의 아날로그 핀의 핀 선언하여 시작 신호가인가되는 것입니다.
int 센서 핀 = A0;
다음으로 115200의 전송 속도로 직렬 통신을 초기화하고 시작합니다.
void setup () { // 직렬 통신을 python 스크립트와 일치하도록 초당 115200 비트로 초기화합니다. Serial.begin (115200); }
마지막으로, 데이터 읽기를 처리하고 데이터를 직렬로 플로터로 보내는 voidloop () 함수입니다.
void loop () { // 아날로그 핀 0의 입력을 읽습니다. float sensorValue = analogRead (sensorpin); 바이트 데이터 = Serial.read (); if (data == 's') { Serial.println (sensorValue); 지연 (10); // 안정성을 위해 읽기 사이에 지연 } }
전체 아두 이노 오실로스코프 코드는 다음과 같이이 문서의 끝에뿐만 아니라 아래와 같습니다.
int 센서 핀 = A0; void setup () { // 직렬 통신을 python 스크립트와 일치하도록 초당 115200 비트로 초기화합니다. Serial.begin (115200); } void loop () { // 아날로그 핀 0: ################################ ###################### float sensorValue = analogRead (sensorpin); 바이트 데이터 = Serial.read (); if (data == 's') { Serial.println (sensorValue); 지연 (10); // 안정성을 위해 읽기 사이에 지연 } }
작동중인 Arduino 오실로스코프
Arduino 설정에 코드를 업로드하고 python 스크립트를 실행합니다. 아래 이미지와 같이 python 명령 줄을 통해 데이터 스트리밍이 시작되고 플롯이 조명 강도에 따라 달라지는 것을 볼 수 있습니다.
이것이 Arduino를 오실로스코프로 사용하는 방법이며, Raspberry pi를 사용하여 만들 수도 있습니다. 여기에서 Raspberry Pi 기반 오실로스코프에 대한 전체 자습서를 확인하십시오.