2026년 7월 13일 월요일

[소스코드 해설] 미니 오실로스코프

[소스코드 해설] 미니 오실로스코프

목차
1. 들어가며...
2. 아듀이노 개발보드
3. 미니 오실로스코프
    3-1. 미니 오실로스코프의 기능
    3-2. 사용된 라이브러리
    3-3. 버튼 입력과 인터럽트
    3-4. 아날로그 입력과 샘플링
    3-5. 데이터 분석
    3-6. 데이터 시현
4. ...

----------------------------------------------
1. 들어가며...

"내 칩"을 만들기 전에 "남의 칩"을 익혀보자. "남의 칩"을 응용에 활용하려면 그들이 제공하는 기술 문서(Data Sheet)를 읽을 수 있어야 한다. 아울러 "내 칩"의 기술 문서를 작성하는 본보기로 삼아본다.

ATmega328P: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

"미니 오실로스코프"는 Atmel 사의 마이크로 컨트롤러 ATmega328P를 채택하여 를 제작한다. 이 칩을 선택한 이유는 개발도구와 응용 라이브러리가 매우 풍부하고 응용 목적에 맞는 기능을 모두 갖추고 있다는 점도 있지만 저렴하다는 것이 큰 이유다. 참고로 요즘 출시된 어지간한 마이크로 컨트롤러들은 이보다 훨씬 우수한 성능을 가지고 있다. ATmega328P은 중앙처리장치(CPU, Central Processing)와 데이터(SRAM, 2KBytes)와 코드(Flash, 32KBytes), EEPROM(1KBytes) 메모리(Memory) 그리고 다양한 주변장치(Peripherals)를 한 패키지에 내장하고있다. 이 칩의 내부 구성은 아래와 같다.



상용 칩들은 널리 판매되기 위해 법용 을 감안하여 설계되고 제작된다. 칩 하나로 우리가 원하는 응용에 필요한 회로는 칩 하나로 끝나지 않는다. 이 칩을 구동 하려면 전원 공급회로가 더해져야 한다. 아울러 개발과정에서 코드의 동작을 확인할 용도로 깜빡이 하나 정도는 있으면 좋다. 칩 내에서 도데체 무슨일이 벌어지는지 알고 싶다. 이 깜빡이는 나중에 개발이 완료되어도 제품 장식에도 도움이 된다. 전원과 기타 보조 회로를 모아 개발하기 편리하도록 범용으로 만들어 판매되는 보드로 아듀이노 우노(Arduino Uno)라는 제품이 있다. 공개 하드웨어(Open-Source Hardware)로써 수없이 많은 아류 제품들이 판매된다. 아듀이노(Arduino)는 ATmega 계열의 칩을 활용한 보드 제품으로 시작했으나 지금은 ARM, ESP32등 다양한 마이크로 컨트롤러의 개발 환경이 되었다. 각 프로세서 칩과 다양한 개발 보드들 아듀이노 환경에 맞춰 설계되 제작되어 판매되고 있다. 자유 소프트웨어 재단(Free Software Foundation)의 GNU C++의 뛰어난 이식성 덕분에 거의 모든 프로세서들의 응용 프로그램 개발 언어가 되었다.

2. 아듀이노 개발보드

"미니 오실로스코프"는 아듀이노 우노를 작은 크기로 축소한 "아듀이노 프로 미니(Arduino Pro Mini)"를 목표보드(target board)로 한다. 회로도는 다음과 같다.
https://www.arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf

ATmega328P는 USB 인터페이스 기능을 내장하고 있지 않으므로 외부에 CH340 칩을 추가하여 작은 크기(26x21.5mm)로 출시한 보드가 "나노 슈퍼 미니(Arduino NANO V3 Super Mini)"다. 아듀이노 개발환경에서 이 보드는 아듀이노 프로 또는 프로 미니(Arduino Pro or Pro Mini)"로 인식된다.


미니 오실로스코프 회로도


3. 미니 오실로스코프

오실로스코프는 등시간간격으로 피 측정 회로의 전압 변화를 측정(샘플)하여 가로 128, 세로 64 화소의 OLED 장치에 시현한다. 피 측정 회로의 전압 변화를 디지털 값으로 변환하기 위해 ADC(Analog-to-Digital Converter), "등간격" 으로 샘플 하기위해 타이머-카운터(TC, Timer-Counter) 그리고 사용자 인터페이스용 버튼 입력을 입출력 포트(IO Port)를 활용한다. ADC, TC 그리고 PORT는 ATmega328P 에 내장되어있다.

3-1. 미니 오실로스코프의 기능

"미니 오실로스코프"의 소스 코드를 읽기 전에 이 장치가 어떤 기능을 갖는지 살펴보자. 시현되는 내용은 샘플한 파형 외에 수직 해상도(전압범위), 수평 해상도(샘플 간격), 트리거 엣지(상승 또는 하강)를 선택 할 수 있다. 측정한 파형을 분석하여 주파수(frequency)와 듀티 비(duty ratio)를 보여준다.
.....
<사진>

3-2. 라이브러리

이제 "미니 오실로스코프"의 응용 프로그램을 읽어보자. 파일명은 Mini_Oscilloscope.ino 다. "내 칩 디자인 킷"의 응용 예제로 포함되어있다. 총 830줄에 이르는 소스코드를 중요 부분으로 나눠 설명한다.


"미니 오실로스코프"는 공개된 소스코드를 일부 수정하였다. 원본 출처를 밝혀둔다.


이미 만들어 놓은 다양한 라이브러리들을 활용하기로 한다. 각 라이브러리에 속한 함수(API, Application Programing Interface)들을 헤더 파일(header file)로 제공하므로 이를 들여온다.


- Wire.h: I2C 장치와 통신에 필요한 라이브러리다.
- Adafruits_GFX.h: Adafruit 사에서 개발하여 공개하는 범용 그래픽 라이브러리다. 점찍기, 줄긋기, 사각형 그리기, 원 그리기, 비트맵 문자 표시 등 다양한 함수들을 제공한다.  깃허브 저장소 링크는 다음과 같다.


API 문서는 아래링크에서 받을 수 있다.


- DIYables_OLED_SSD1309.h: 특정 OLED 칩의 드라이버 라이브러리다. 수많은 개발자들에 의해 드라이버가 개발되어 공개됐다. 이 드라이버는 SSD1309(2.4"), SSD1315(0.96"), SSD1306(0.96") 등과 호환된다.
- EEPROM.h: ATmega328P 에 내장된 플래시 메모리는 프로그램 코드를 저장하는 공간이다. 이 영역을 고정 데이터로 사용하기 위한 라이브러리다.

3-3. 버튼 입력과 인터럽트


버튼 입력을 받아들일 포트를 정의하였다. 외부의 입력을 받아들이는 방식은 폴링(polling)과 인터럽트(interrupt)다. 여기에서는 인터럽트 방식으로 버튼 입력을 처리한다.



AVR 계열 CPU는 2개의 인터럽트 채널을 가지고 있다. D2는 IRQ0, D3 핀은 IRQ1 이다. "미니"보드에 D3 핀이 노출되어 있다. D3 핀을 인터럽트로 사용하기 위한 초기화는 다음과 같다.


초기화 setup() 함수내에 D3 핀을 입력 풀-업으로 설정한 후 인터럽트를 처리할 함수(interrupt handler)를 지정한다. Btn_IRQ를 IRQ1에 연결한다. 인터럽트로 인지하는 조건은 해당 핀에 하강 엣지 사건(FALLING)으로 정의하였다.


인터럽트 처리할 함수 Btn_IRQ()는 다음과 같다. 버튼의 디지털 값을 모두 읽은 후 값이 모두 1(high) 이면 잘못 호출된 것으로 간주 한다. 버튼은 기계 스위치다. 접점에 발생하는 스파크로 인해 인터럽트 오동작이 있을 수 있다. 버튼 값을 읽기 전에 잠시 쉬었다가(delay) 여전히 버튼이 눌려 있는지 확인한다.


눌려진 버튼에 따라 해당하는 기능을 수행한다. Select 버튼이 눌리면 기능 변수 변경한다. 변수 scopeP가 0일때 수직범위(전압), 1일때 수평범위(샘플 간격), 2일때 트리거 방향(상승또는 하강 엣지)을 선택한다.


Down(또는 Up)버튼이 눌리면 해당 기능에서 표시 값을 변경한다.


오실로스코프의 동작을 잠시 멈추는 HOLD 버튼의 기능은 다음과 같다.


3-4. 아날로그 입력과 샘플링

오실로스코프 아날로그 입력 채널은 0이다.


아날로그 값(전압)을 디지털로 변환하는 기준 전압은 칩 내부 전압(1.1V)으로 정한다. ADC는 기준 전압과 입력 전압을 비교하여 디지털 값으로 나타낸다.


ATmega328P의 ADC 구성은 아래와 같다. 프로그램 코딩을 하기전에 구성도를 보고 대략적인 사용법을 이해할 수 있으면 좋겠다. 어쨌든 눈에 익혀두자.



ATmega328P에 내장된 ADC의 해상도는 10비트다. ADC의 기준전압에 따라 해상도 전압이 달라진다. 칩의 동작전압 5V를 기준 전압으로 삼을 경우 이를 10비트로 나누면 해상도는 0.004882(=5/1024)다. 내부에 정전압 회로(voltage reference)의 출력 1.1V를 ADC 기준 전압으로 설정할 수 있다. ADC의 기준 전압을 INTERNAL로 설정한 경우 해상도는 1mV(0.00097=1.1/2024)로 세밀한 측정이 가능하도록 하였다. 비록 "미니 오실로스코프"가 칩 내외부의 잡음 대책을 세우지 않은 데다가 표시 장치의 수직 해상도가 64화소에 불과하지만 나름 정밀도를 추구한다. ADC의 기준을 1.1V이지만 피측정 회로의 전압 범위는 이보다 넓어야 한다. 분압기 회로를 구성하여 피측정 입력 변동폭을 넓혔다.


<Voltage Divider 그림>

분압기에 사용한 저항의 신뢰도가 문제될 수 있다. 음의 전압을 인가하면 칩이 소손될 수 있으므로 주의해야 한다. 양의 전압 뿐만 아니라 음의 전압 측정도 가능하려면 "프론트-엔드" 회로를 넣어 주도록 한다.

"미니 오실로스코프"의 아날로그 입력 전압을 디지털로 변환(샘플링)하는 함수는 readWave() 다.


샘플링은 시간상 등간격으로 이뤄져야한다. 나름 정교하게 계산하여 샘플링 간격을 정하고 있다. 마이크로 초 단위의 지연 API, delayMicrosecond()를 사용하여 등간격을 맞추고 아날로그 값을 디지털로 변환, analogRead() 한다. 한번에 취할 값은 200개(=REC_LENG)다.

만일 200개의 샘플에 주기가 200ms인 파형 10개를 담는것이 목표라고 하자. 샘플링 간격은 10ms(=200x10/200)다.


칩의 작동 주파수는 16Mhz이다. 사양서에 따르면 AD변환기를 제어하는 레지스터 ADCSRA의 하위 3비트는 ADC의 클럭의 분주비를 나타낸다. 프리-스케일러 ADPS[2:0]=111b이면 분주비는 128이다. 따라서 ADC 클럭은 16Mhz/128=125Khz다. 한번의 ADC 동작에 13클럭이 소요되므로 ADC 시간은 (1/125000)*13=0.0001초다.


그외 샘플을 반복하고 비교 분기 명령 수행에 소요되는 클럭을 감안하여 대략 7888마이크로 초 간격의 지연을 두고 있다. 이 값은 다분히 여러번의 실험끝에 나온 숫자로 짐작된다.


샘플간격 지연을 타이머의 마이크로초 단위 API가 할 수 있는 범위 이하일 경우 기계어 nop (no-operation)의 수행 시간을 넣었다 asm("nop").




3-5. 데이터 해석

주파수
듀티 비
엣지 트리거

3-6. 표시

OLED 장치 초기화



4. ....














2026년 7월 10일 금요일

미니 오실로스코프 프론트 엔드

미니 오실로스코프 프론트 엔드


1. 개요
    오실로스코프의 아날로그 프론트-엔드[참고]
    OpAmp이용 아날로그 입력 범위 조정(-5V-+5V to 0V-5V) [참고]

2. 회로도
    FrontEnd_SCH.pdf

2. PCB
 

3. 부품
    MC6002, Rail-to-Rail 듀얼 OpAmp

4. 조립
    - PCB 제작중...
5. 시험



Arduino Uno(ATmega 328p)+0.9" OLED 실험 키트

Arduino Uno(ATmega 328p)+0.9" OLED 실험 키트

1. 개요

2. 응용
    pong_Uno.ino

3. 회로도

4. PCB
 

5. 부품목록 및 구입처
모듈
    1. NANO V3.0 / Nano SuperMini Type-C 개발 보드
        atmega328p 칩 ch340 Arduino 용 직렬 포트 (1개)
        https://ko.aliexpress.com/item/1005007342237827.html
    2. 0.96 인치 iic 직렬 옐로우 블루 oled 디스플레이 모듈 128x64 (1개)
        i2c ssd1306 12864 lcd 스크린 보드 gnd vcc scl sda for arduino
        https://ko.aliexpress.com/item/32869184826.html
    3. DC-DC 0.9-3.3V ~ 3.3V 500mA 0.9-5V ~ 5V 미니 스텝 업 부스트(1개)
부품
    4. IN4148 DO-35 고속 스위칭 다이오드 (5개)
        https://ko.aliexpress.com/item/1005009379098965.html
    5. RM-065 시리즈 가변 저항 트리머 1M 옴, 상단 조정 (1개)
        https://ko.aliexpress.com/item/1005009881045452.html
    6. 1/8w 금속 필름 저항기(10, 100, 10K, 100K,각 1개)
        https://ko.aliexpress.com/item/1005002852712445.html
    7. 50V 모놀리식 세라믹 커패시터 (100nF/104,1개)
기구
    8. 5 방향 탐색 키 모듈 독립 키보드 키 스위치 버튼 5D 조이스틱 마이크로 컨트롤러(1개)
    9. 슬라이드 스위치 마이크로 전원 토글 스위치, 단일 및 이중 열 직접 삽입, 수평 슬라이딩
         (SS12D00, 핀간격 2.5mm, 1개)
        https://ko.aliexpress.com/item/1005007736314869.html
    10. 직각 핀헤더(2P, 3개)
    11. 암 와이어 테스트 후크, 컬러 듀폰, 모든 구리 용접 로직 분석기, 테스트 클램프, DIY, 20cm
        (Yello, Black, 각 1개)
        https://ko.aliexpress.com/item/1005004479009849.html
    12. AAA 배터리 상자 배터리 홀더(1개)
        https://ko.aliexpress.com/item/1005006274732583.html
    13. M3 PCB 마더 보드 검정색 나일론 플라스틱 필립스 나사 볼트 남성-여성 여성 육각 스탠드 오프
        (육각형 기둥 스페이서 길이 15mm-M3, 육각너트-M2, 1조)
        https://ko.aliexpress.com/item/32976004197.html

6. 조립
    - PCB 제작중...
7. 시험




2026년 6월 22일 월요일

Arduino Oscilloscope

Arduino Oscilloscope

https://www.youtube.com/watch?v=exiWoeLm4Wc


회로도


펌웨어

https://drive.google.com/drive/folders/1N5HWoD-7X_7zkp9H1VvZ1t5_Vy6dVNKT


arduino-oled-dual-channel-oscilloscope

https://projecthub.arduino.cc/siliconvalley4066/arduino-oled-dual-channel-oscilloscope-197863


HS402

https://oshwlab.com/martinloren/hs402-pro