T 기술기고문

버추얼 일렉트로닉스 랩: 파이썬과 ADALM2000을 사용하여 오실로스코프 개발하기

글: 크리스티안 제이슨 가르시아(Christian Jason Garcia) 소프트웨어 시스템 엔지니어,
어니 매 배스(Arnie Mae Baes) 소프트웨어 시스템 시스템 엔지니어 / 
아나로그디바이스(Analog Devices, Inc.)
 
개요
버추얼 일렉트로닉스 랩(virtual electronics laboratory)은 소프트웨어 기반 계측기들의 집합이다. 소프트웨어 애플리케이션을 사용해서 가상으로 실험실 환경을 구현한 것으로서, 사용자들이 다양한 전자 실험을 실시할 수 있다. 포괄적인 기능을 갖춘 물리적 랩 환경을 구축하는 데에는 비용이 많이 들 뿐 아니라 관리하기도 까다롭다. 하지만 실험실 장비를 주머니 안에 넣고 다니면서 활용할 수 있다고 생각해 보라. 그야말로 무궁무진한 가능성이 펼쳐질 것이다.
이 글에서는 사용자들이 ADALM2000을 사용해서 자신만의 가상 실험실 장비를 개발할 수 있는 방법에 대해 설명한다. 이 글에서는 파이썬(Python) 프로그래밍 언어를 사용해서 설명한다. 파이썬은 단순하기도 하고 오픈 소스로 제공되기 때문이다. 파이썬과 ADALM2000을 사용해서 오실로스코프, 신호 발생기, 디지털 멀티미터 같은 다양한 가상 랩 장비를 개발할 수 있는데, 이 글에서는 오실로스코프에 초점을 맞춰서 설명한다. 오실로스코프는 실제 랩에서 가장 기본적으로 사용되는 장비 중의 하나이다. 
 
머리말
계측기 업계가 꾸준히 가상화로 옮겨가고 있다. 소프트웨어 기반의 계측기는 측정/제어하고자 하는 디바이스와 연결되는 최소한의 전문 하드웨어를 사용하는 PC 상에 호스트된다. 통상적으로 이러한 하드웨어에는 신호를 직접 디지털화하거나 독립형 장비를 제어하기 위한 플러그인 보드가 포함된다.
가상 계측기는 유연성, 모듈성, 휴대성이 뛰어난 것으로 알려져 있다. 아나로그디바이스(Analog Devices)는 이러한 용도를 포함하여 거의 모든 활용 사례를 충족하는 전자 모듈을 제공한다. 이러한 모듈 중 하나가 ADALM2000이다.
ADALM2000을 사용해서 엔지니어나 개발자는 각자의 필요에 맞는 가상의 랩 장비를 개발할 수 있다. libm2k 라이브러리를 통해 사용자는 C++, C#, 파이썬을 사용하여 ADALM2000을 제어하기 위한 소프트웨어 애플리케이션을 개발할 수 있다. ADALM2000과 libm2k에 대해서는 뒤에서 더 자세히 설명한다.
 
오실로스코프 소개
오실로스코프는 전자 공학의 필수 장비로서, 일반 회로 및 복잡한 회로의 신호 분석에 활용된다. 오늘날의 오실로스코프는 컴퓨터 연결 기능이 있어서 오실로스코프로 포착한 신호를 디지털로 저장했다가 나중에 분석할 수도 있다.
 
그림 1: 오실로스코프의 외관 예시
 
오실로스코프를 사용하여 아날로그 또는 디지털 파형의 전압 및 시간 특성을 시각화할 수 있다. 전면 패널의 기능들(증폭기 트리거링, 스위프 타이밍, 디스플레이)을 사용하면 신호를 더 잘 시각화하도록 디스플레이를 조작할 수 있다.
오실로스코프는 특정한 시간 동안의 신호 입력 동작을 화면에 보여주는데, 이는 일반 회로 분석에 꼭 필요한 기능이며, 이들 회로의 기능을 검증하는 데에도 유용하다. 오실로스코프가 모든 전자 실험실에서 필수 장비 중 하나로 꼽히는 이유가 여기에 있다. 이 외에도, 엔지니어들은 자신의 필요에 맞게 오실로스코프를 맞춤화 함으로써 특정한 전자 회로의 분석을 더욱 향상할 수 있다.
 
ADALM2000 소개
ADALM2000은 디지털 오실로스코프, 함수 발생기, 로직 분석기, 볼트미터, 스펙트럼 분석기, 디지털 버스 분석기 기능과 함께 2개의 프로그래머블 전원 공급 장치를 특징으로 하는 능동적인 학습 모듈이다. 초보 사용자나 학생들은 Scopy를 사용해서 ADALM2000과 인터페이스 할 수 있다. 애플리케이션 개발자들은 libm2k 라이브러리를 사용해서 애플리케이션 인터페이스를 개발할 수 있다. 또한 펌웨어 개발자들은 ADALM2000 상에서 곧바로 실행되는 맞춤형 소프트웨어나 HDL을 개발할 수도 있다.
 
시작하기
파이썬과 파이참 설치
파이썬(Python)은 강력하고도 배우기 쉬운 오픈 소스 프로그래밍 언어이다. 파이썬은 파이썬 공식 웹사이트에서 다운로드할 수 있다. 어떤 버전을 사용해야 할지 모르겠다면 Python 3.7을 선택한다.
파이썬은 통합 개발 환경(IDE) 없이 사용할 수 있으나, 라이브러리를 다운로드하고 디버깅할 때 번잡하지 않게 하고자 한다면 파이참을 사용할 수 있다. 파이참(PyCharm)은 파이썬 개발을 위해 가장 널리 사용되는 IDE로서, 개발자들을 위한 여러 필수 툴들을 제공한다. JetBrains 공식 웹사이트에서 파이참 커뮤니티(PyCharm Community) 최신 버전을 다운로드 할 수 있다.
 
라이브러리 설치
파이썬 라이브러리는 특정 애플리케이션에 유용한 기능이나 함수들을 포함한다. 이 글에서는 libm2k, matplotlib, NumPy를 사용한다.
 
libm2k
파이썬을 사용해서 ADALM2000과 인터페이스하기 위해서는 libm2k 라이브러리를 설치해야 한다. 이 라이브러리는 파이썬, C#, MATLAB®, LabVIEW®에 대한 바인딩을 제공하는 C++ 라이브러리로서, 다음과 같은 기능들을 포함한다: 
AnalogIn: 오실로스코프 또는 볼트미터용. 이 글에서는 이 기능에 초점을 맞춘다.
AnalogOut: 신호 발생기용
Digital: 로직 분석기 또는 패턴 발생기용
PowerSupply: 정전압 발생기용
DMM: 디지털 멀티미터용
 
libm2k wiki 페이지에서 이 라이브러리에 관한 자세한 정보를 볼 수 있다.
 
libm2k 설치
이 라이브러리는 다음과 같은 순서대로 설치할 수 있다:
다운로드 페이지로 이동한다. 
이 라이브러리의 최신 버전을 다운로드한다. 예: libm2k-0.4.0-Windows-Setup.exe
이 실행 파일을 실행한다. 추가 작업을 선택하라는 Setup 창이 뜨면 ‘Install libm2k Python bindings’를 선택한다.
 
그림 2: libm2k 설치 창
 
설치를 마친다. libm2k가 파이썬의 디폴트 환경에 설치된다.
 
Matplotlib
오실로스코프 디스플레이를 생성하려면 matplotlib 라이브러리를 사용할 필요가 있다. 이 라이브러리는 파이썬으로 시각화를 맞춤화 및 디스플레이 하기 위한 용도로 널리 사용되는 편리한 라이브러리이다. 이 라이브러리에 관한 자세한 정보는 matplotlib 웹사이트에서 볼 수 있다.
 
NumPy
간단한 오실로스코프라 하더라도 많은 수학적 계산을 필요로 한다. NumPy 라이브러리는 복잡한 계산을 위한 간단한 함수들을 제공한다. 이 라이브러리에 관해서는 NumPy 웹사이트에서 자세한 정보를 볼 수 있다.
 
Matplotlib와 NumPy 설치
matplotlib와 NumPy는 파이참에서 다음과 같은 순서대로 설치할 수 있다:
File > Settings > Project Interpreter 순으로 이동한다.
Settings 창의 오른쪽에 있는 + 아이콘을 클릭한다.
Available Packages 창이 활성화되면 검색창에서 matplotlib와 NumPy를 검색한다.
설치할 버전을 선택한다(최신 버전 선택).
‘Install Package’ 버튼을 클릭한다.

그림 3: 파이참에서 라이브러리 패키지 설치
 
하드웨어 셋업
코딩을 시작하기 전에 먼저 하드웨어 장치들을 셋업해야 한다. 다음과 같은 하드웨어 장치들이 필요하다:
신호 소스(또는 활용 가능한 신호 발생기)
ADALM2000
프로브와 클리퍼
 
신호 발생기를 사용할 수 있다면 프로브와 클리퍼를 사용해서 그림 4에서 보는 것과 같은 구성으로 ADALM2000 디바이스를 채널 1과 채널 2에 연결한다. 
 
그림 4: 신호 발생기와 ADALM2000 연결하는 실제 설정 예시
 
표 1: 핀 구성
 
 
다른 신호 소스를 사용하더라도 같은 구성으로 연결할 수 있다. ADALM2000 디바이스를 USB 포트를 통해 PC로 연결한다.
 
간단한 버추얼 오실로스코프
이제 프로그램을 한 블록씩 살펴보기로 한다. 코드가 어떤 일을 하고 코드를 어떻게 작성하는지 설명한다. 그리고 이 베이스 코드에다 활용 사례에 따라서 추가 기능들을 더하는 것을 설명한다.
 
간단한 버추얼 오실로스코프를 개발하기 위해, 먼저 3개의 라이브러리(libm2k, matplotlib, NumPy)를 불러온다. 
 
 
URI(uniform resource identifier)는 PC에 연결된 각 ADALM2000의 고유 식별자이다. 이 코드 블록이 ADALM2000을 PC와 연결되도록 한다. PC에 연결된 ADALM2000 디바이스가 없으면 코드는 자동으로 종료된다.
 
 
URI가 인식되었으면 ADALM2000으로 연결한다. 연결된 디바이스가 한 개 이상일 경우, uri[0]은 첫 번째로 인식된 ADALM2000 디바이스의 URI를 나타낸다. 
 
 
ADC 및 DAC에 대해서 캘리브레이션을 실시한다. 이것은 정확한 측정을 얻기 위해서 중요하다.
 
 
샘플 레이트와 지속시간을 설정한다. 이용할 수 있는 샘플 레이트는 1kHz, 10kHz, 100kHz, 1MHz, 10MHz, 100MHz이다. 샘플 레이트는 1초 동안 샘플을 포착하는 횟수이고, 지속시간은 샘플을 얼마나 오랫동안 포착할지 지정하는 것이다. 예를 들어서 샘플 레이트를 1000으로, 지속시간을 3으로 설정하면 초당 1000개의 샘플을 3초 동안 포착하는 것이다. 그러면 총 3000 샘플을 포착하는 것이다.
 
 
오실로스코프를 작동시키고 채널 1을 아날로그 입력으로 설정한다.
 
 
Linspace를 사용해서 간격이 일정한 샘플 어레이를 얻을 수 있다. 이 NumPy 함수를 사용해서 시간 x축 데이터 어레이를 생성한다. 이 함수의 첫 번째와 두 번째 파라미터는 각 어레이의 시작 값과 끝 값을 나타낸다. 마지막 파라미터는 시작 값과 끝 값 사이에서 발생시키고자 하는 샘플 수를 나타낸다.
 
이 예의 경우에 시작 값은 0이고 끝 값은 설정된 지속시간, 다시 말해서 3이다. duration과 sample_rate를 곱해서 총 샘플 수를 계산할 수 있다. 이 경우에 3000 샘플이다. 0과 3 사이에서 이 3000 샘플이 균일한 간격이 되도록 한다. 이 어레이는 time_x에 저장된다.
 
data_y는 ADALM2000 디바이스를 사용해서 포착한 파형 샘플들을 저장한다. 채널 1의 샘플들은 data_y[0]에 저장되고, 채널 2의 샘플들은 data_y[1]에 저장된다. 정확한 주파수로 파형을 표시하기 위해서 time_x에 사용된 것과 같은 샘플 수여야 한다.
 
 
그림을 생성하고 조작한다. plt.subplots 함수가 그림 객체(g에 저장)와 축 개체(ax에 저장)를 생성한다. 이들 객체를 사용해서 전체적인 플롯을 맞춤화할 수 있다.
 
파형을 보기 쉽게 눈금선을 추가할 수 있다. 축 레이블과 y 한계를 추가해서 플롯에 대한 세부 사항을 추가할 수 있다.
 
 
그래프를 표시한다.
 
 
코드의 마지막에서 컨텍스트를 종료한다.
 
 
이 코드를 실행하면 그림 5와 같은 결과를 얻는다.
 
그림 5: 단일 채널 사인파 출력. 단일 신호 발생기 출력: 10Hz 2Vp-p
 
2채널 버추얼 오실로스코프
앞서 설명한 코드에 몇 개의 코드 블록을 추가함으로써 2채널 버추얼 오실로스코프를 만들 수 있다.
 
또 다른 채널을 추가하기 위해, ocsi.enableChannel과 ocsi.setRange 라인을 복사하고 첫 번째 파라미터를 libm2k.ANALOG_IN_CHANNEL_1에서 libm2k.ANALOG_IN_CHANNEL_2로 변경한다.
 
 
그래프를 생성할 때 채널 2를 위한 플롯도 추가해야 한다. 채널 2의 데이터는 어레이 data_y[1]에 들어있다. 구분을 쉽게 하기 위해서 두 플롯의 색상을 변경할 수 있다. 이 예시의 경우, 채널 1에는 “light coral”을 사용하고 채널 2에는 “steel blue”를 사용했다.
 
 
이 코드를 실행하면 그림 6과 같은 결과를 얻는다.
 
그림 6: 2채널 사인파 출력. 채널 1 신호 발생기 출력: 10Hz 2Vp-p, 채널 2 신호 발생기 출력: 5Hz 3Vp-p
 
버추얼 오실로스코프의 추가 기능
이번에는 버추얼 오실로스코프를 좀더 액티브하게 만드는 기능들을 추가해 보자. 이를 위해서는 matplotlib가 제공하는 다양한 위젯을 사용할 수 있다. 이 예시에서는 텍스트 레이블과 슬라이더 위젯을 사용하고 있다. 앞서 설명한 코드에 이어서 덧붙여 나간다.
 
matplotlib slider를 불러오기 위해서 또 다른 import 문을 추가한다.
 
 
시간과 데이터 어레이를 NumPy 어레이로 변환한다. 이것들은 다음 코드 블록에서 실행할 계산에 사용된다.
 
 
파형 데이터를 포착했으면 파형의 속성을 도출할 수 있다. 아래 코드 블록에서는 양쪽 채널의 포착된 데이터로부터 Vpp, Vave, Vrms를 추출했다. Vpp를 계산하기 위해서는 data_y numpy 어레이로 구해진 최대 값과 최소 값의 절대값을 더한다. Vave를 계산하기 위해서는 Vpp를 pi로 나눈다. Vrms를 계산하기 위해서는 Vpp를 2 x √2로 나눈다. 
 
 
다음 코드 블록은 위에 설명한 예와 비슷한데, 원래 어레이가 아니라 NumPy 어레이를 사용한다는 것만 다르다. 이들 플롯으로부터 파형 객체를 생성한다. 이 객체는 나중에 사용할 것이다. 
 
 
계산된 Vpp, Vave, Vrms를 표시하기 위해 matplotlib 라이브러리로부터 텍스트 레이블 위젯을 사용한다. 문자열 레이블 label_ch1과 label_ch2를 생성하고 이 두 문자열을 합쳐서 최종 레이블 n_label을 생성한다. plt.text를 사용해서 텍스트 레이블을 생성한다. 첫 번째와 두 번째 파라미터(0.2, 3)는 텍스트의 x 및 y 위치다. 세 번째 파라미터는 표시할 문자열이다. 네 번째와 다섯 번째 파라미터는 각각 텍스트와 박스 스타일을 나타낸다.
 
 
이번에는 오프셋 슬라이더를 추가해 보자. 이 슬라이더의 목적은 파형의 레퍼런스 레벨을 조절할 수 있도록 하는 것이다. 메인 플롯의 위치를 움직여서 슬라이더를 만들 공간을 확보한다. plt.axes를 사용해서 슬라이더의 크기, 위치, 페이스 색상을 지정한다. Slider 함수를 사용해서 특정한 속성을 가진 오프셋 슬라이더 객체를 생성한다.
 
 
update_offset 함수를 작성하고 offset_slider 객체로 등록한다. 이 함수가 슬라이더를 조절할 때마다 파형에 오프셋을 추가한다.
 
 
이 코드를 실행하면 그림 7과 같은 결과를 얻는다.
 
그림 7: 오프셋 슬라이더를 적용했을 때 디폴트 2채널 사인파 출력
 
이 슬라이더를 사용해서 오프셋을 조절해 보자. 조절에 따라서 파형이 실시간으로 위아래로 움직이는 것을 볼 수 있다.
 
그림 8: 왼쪽의 오프셋 슬라이더를 움직여서 양쪽 채널 출력의 오프셋을 조절할 수 있다.
 
맺음말
이 글에서는 버추얼 랩이 얼마나 유용하고, ADALM2000과 파이썬을 사용해서 버추얼 오실로스코프를 어떻게 편리하게 개발할 수 있는지 설명했다. 아울러 소프트웨어 요구사항과 하드웨어 셋업을 설명하고 3가지 코드 사례를 소개했다.
 
참고문헌
“ADALM2000 Overview.” Analog Devices, March 2021.
Bhunia, Chandan, Saikat Giri, Samrat Kar, and Sudarshan Haldar. “A Low-Cost PC-Based Virtual Oscilloscope.” IEEE Transactions on Education, Vol. 47, No. 2, May 2004.
“Limb2k Examples: analog.py.” Analog Devices, Inc.
Tegen, Amelia and Wright, Jeremy. “Oscilloscopes: The Digital Alternative: The Digital Scope’s Capability in Measurement, Transient Capture, and Data Storage Is a Significant Improvement Over its Analog Counterpart.” IEEE Potentials, Vol. 2, 1983.
“What Is libm2k?” Analog Devices Wiki, April 2021.
 
저자 소개
어니 매 배스(Arnie Mae Baes)는 2019년 12월에 아나로그디바이스에 펌웨어 엔지니어로 입사했다. 첫 해에는 GUI와 펌웨어 개발을 맡았으며, 2020년 12월에 컨슈머 소프트웨어 엔지니어링 그룹에 합류해서 펌웨어 테스트 개발을 맡고 있다. 필리핀 바탕가스 주립대학에서 전자공학 학사학위를 취득했다. 문의: arniemae.baes@analog.com
 
크리스티안 제이슨 가르시아(Christian Jason Garcia)는 아나로그디바이스(필리핀 제너럴 트리아스)의 펌웨어 검증 엔지니어이다. 2018년 11월에 ADI에 입사했으며, 산토 토마스 대학에서 전자 및 통신공학 학사학위를 취득했다. e-모빌리티 그룹에서 SmartMesh 네트워크 소프트웨어 테스트 및 시스템 검증을 맡고 있다. 문의: christian.garcia@analog.com