Journey to CS/임베디드 12

[ATmega328P] 레지스터: I/O 주소와 데이터 주소 이해하기

MCU 프로그래밍을 할 때 데이터시트를 보면 같은 레지스터에 두 가지 주소가 붙어있는 걸 볼 수 있다. 하나는 I/O 주소, 다른 하나는 데이터 주소다. I/O 주소ATmega328P에는 64바이트짜리 작은 공간이 있다.여기에 PORTB, DDRB, PINB 같은 하드웨어 제어 레지스터가 배치돼 있다.이 공간의 주소를 I/O 주소라고 부른다.이 영역은 CPU의 특수 명령어 IN, OUT, SBI, CBI 같은 걸로 접근할 수 있다.장점은 빠르다는 것. 1클럭에 입출력을 처리할 수 있다. 데이터 주소동시에, 똑같은 레지스터들이 SRAM 공간에도 매핑돼 있다.이게 데이터 주소다.예를 들어 PORTB의 경우:I/O 주소: 0x05데이터 주소: 0x25데이터 주소로 접근할 때는 LDS, STS 같은 일반 메모리..

[ATmega328P] 레지스터 직접 제어 방식으로 프로그래밍 해보기

이번 포스팅에서는 ATmega328P 마이크로컨트롤러를 레지스터 직접 제어 방식으로 프로그래밍하는 방법에 대해서 알아본다. 레지스터 방식은 Arduino IDE에서 사용하는 digitalWrite() 같은 함수 호출 방식보다 더 효율적이고 하드웨어에 가깝게 제어할 수 있다. 💡 레지스터란?레지스터는 마이크로컨트롤러 내부에 있는 매우 빠른 임시 저장 공간이다.ATmega328P에서는 특정 기능을 제어하기 위해 여러 레지스터를 사용한다.아래 예시 프로그램에서는 포트의 입출력 방향을 설정하는 DDRB 레지스터와, 포트의 출력 상태를 제어하는 PORTB 레지스터를 사용한다. 예시: ATmega328P의 PB5 핀에 연결된 LED를 1초 간격으로 깜빡이는 프로그램#define F_CPU 16000000UL#in..

[메모리] 엔디언(Endianness)과 포인터 캐스팅(casting)

이번 포스팅에서는 메모리 주소와 관련된 개념인 엔디언과 포인터 캐스팅에 대해 다루어 보려고 합니다.1. 엔디언(Endianness)이란?컴퓨터 메모리는 바이트(byte) 단위로 구성되어 있습니다.int와 같은 여러 바이트로 이루어진 데이터 타입을 메모리에 저장할 때, 바이트들의 순서를 정하는 방식이 바로 엔디언입니다.엔디언에는 크게 두 가지 방식이 있습니다.빅 엔디언(Big Endian): 가장 큰 바이트(최상위 바이트)를 가장 작은 주소에 저장하는 방식입니다. 사람이 숫자를 읽는 방식과 유사해 직관적입니다.리틀 엔디언(Little Endian): 가장 작은 바이트(최하위 바이트)를 가장 작은 주소에 저장하는 방식입니다. 대부분의 x86 아키텍처(인텔, AMD 등)가 이 방식을 사용합니다.예) 16진수 ..

아두이노에서 어떤 정수 타입을 써야 할까? 데이터 타입 비교표 한 눈에 보기

아두이노 코드를 보다 보면 uint8_t, uint16_t, uint32_t 같은 낯선 타입이 자주 등장한다.uint8_t, uint16_t, uint32_t가 무슨 뜻인지, 아두이노 기본 타입과 어떻게 대응되는지, 그리고 어떤 상황에 어떤 타입을 써야 하는지 알아보자. 1. 읽는 방법uint32_t를 예로 들면:uunsigned (부호 없음, 0 이상)int정수(integer)32비트 수 (32비트 = 4바이트)_ttype (자료형) 2. Arduino 기본 타입과 1:1 대응표고정폭 타입 (stdint.h)Arduino 기본 타입크기(byte)값 범위부호uint8_tbyte10 ~ 255부호 없음int8_tchar1-128 ~ 127부호 있음uint16_tunsigned int20 ~ 65,535부호..

[아두이노] millis() 타이머 함수로 진동모터와 LED 동시에 작동시키기

지난 포스팅에서 PWM을 적용해서 LED에 페이드 인 & 페이드 아웃 효과를 주는 방법에 대해 알아보았다. 이번에는 진동 모터(vibration motor) 기능을 추가하여 LED가 페이드인/아웃 하는 동시에 진동이 같이 울리는 프로그램을 구현해 보려고 한다. 우선 여기서 중요한 것이 LED와 진동모터 두 가지 작업을 어떻게 동시에 비동기적으로 처리하느냐가 될 것이다. 아두이노 프로그램은 기본적으로 loop() 함수 안의 코드를 매우 빠르게 반복 실행한다.만약 특정 동작(예: LED 켜기/끄기, 센서 값 읽기)을 일정 시간 간격으로 실행하고 싶다면 어떻게 해야 할까? 가장 간단하게 생각할 수 있는 방법은 delay() 함수를 사용하는 것이다.예를 들어, delay(1000); 를 사용하면 1초 동안 프..

아두이노 스케치를 작성하다가 loop()함수에 대해 생긴 의문...그리고 답

최근에 소프트웨어 경진대회 프로젝트를 하다가 진동 모터를 하나 얻어오게 되었다.진동 모터를 가지고 어떤 실습을 해볼까 하다가, 아두이노에 진동 모터, LED, 버튼을 연결하여 버튼을 한 번 눌렀다 떼면 3초 동안 LED가 밝아졌다가 어두워지면서 동시에 진동 모터가 울리는 프로그램을 만들어 보기로 했다. 그런데 한 가지 의문이 생겼다. 아두이노 프로그램은 기본적으로 초기 설정을 하는 setup() 함수가 한 번 실행된 후에는 loop() 함수를 무한 반복 실행한다. 그런데 바로 그 '반복 실행'이라는 점이 약간 이해가 되지 않았다. 내가 지금 만들고자 하는 프로그램은 버튼을 한 번 릴리즈하면 진동과 LED가 3초 동작하고 끝나는 프로그램으로, 반복 동작이 없다.그런데 이걸 왜 setup() 함수가 아닌 ..

아두이노에 PWM을 적용해서 LED에 페이드 인 & 페이드 아웃 효과 주기

알다시피 디지털 신호는 켜짐(HIGH)과 꺼짐(LOW) 딱 두 가지 상태만 가진다. 그런데 LED를 서서히 밝히거나 어둡게 하고 싶다면 어떻게 해야 할까? 마치 아날로그 신호처럼 부드러운 밝기 조절이 필요할 때, 바로 PWM(Pulse Width Modulation), 즉 펄스 폭 변조가 그 솔루션이 될 수 있다. PWM은 디지털 신호를 아날로그처럼 활용하는 기술이다.PWM 개념PWM은 일정한 주기를 가진 펄스 신호를 사용한다. 이 주기 안에서 신호가 켜져 있는 시간의 비율을 듀티 사이클(Duty Cycle)이라고 부른다.듀티 사이클이 높으면: 켜져 있는 시간이 길어져 평균 전압이 높아진다.듀티 사이클이 낮으면: 켜져 있는 시간이 짧아져 평균 전압이 낮아진다.이때 펄스가 너무 느리게 켜지고 꺼지면 장치가..

ESP32 시뮬레이터 - WOKWI 소개

오늘은 아두이노와 비슷하면서도 몇 가지 부가 기능을 더 갖춘 ESP32에 대해서 간략하게 설명하고, ESP32 보드를 웹에서 (일부) 무료로 시뮬레이션 해볼 수 있는 사이트를 소개하려고 한다. ESP32란? ESP32는 Espressif Systems에서 개발한 마이크로컨트롤러 보드로, Wi-Fi와 Bluetooth 기능이 내장되어 있어 IoT 프로젝트에 많이 사용된다. 저전력으로 동작하며 가격이 저렴하고, 다양한 센서 및 액추에이터와 쉽게 연동할 수 있어 스마트홈, 환경 모니터링, 원격 제어 시스템 등에 적합하다.개발은 Arduino IDE나 PlatformIO 같은 환경에서 진행할 수 있고, C나 C++를 기반으로 동작한다. ESP32는 아두이노처럼 사용할 수 있지만, 내장 무선통신, 높은 클럭 ..

[아두이노] 푸시버튼을 적용한 S.O.S 신호 점멸 구현

어제 우리 프로젝트 팀의 첫 오프라인 미팅이 있었다. 플젝 진행 방향에 대한 논의가 끝나고 잠시 남아서 리더님에게 아두이노 푸시버튼 연결을 좀 도와달라고 했다. 지난 글에서 아두이노 내장 LED로 S.O.S 신호 깜빡이기 실습을 했는데, 이 때 사실 원래 목표는 루프로 계속 돌리지 않고, 버튼을 한 번 눌렀다 떼면 S.O.S 신호가 한 차례 점멸하도록 하는 것이었다. 그런데 브래드보드에 푸시버튼과 점퍼와이어를 연결하는 방법을 제대로 몰라서 결국 이렇게 저렇게 시도하다가 포기했었는데, 어제 드디어 프로젝트 미팅에 가서 성공시켰다. (내가 한 건 아니고 리더님이 해주셨지만... ㅎㅎ) 우선 가장 중요한 회로를 다시 복기해 보도록 한다. 지난 포스팅에서 소개했던 팅커캐드를 이용해서 회로를 깔끔하게 정리해 보..

아두이노 내장 LED로 S.O.S 구조 신호 깜빡이게 만들어 보기

3주동안 나의 체력을 무지막지하게 갉아먹었던 기말시험이 드디어 끝났다. 시험이 끝난 기념으로 드디어 한 달 전에 산 아두이노 보드를 꺼내서 실제로 작동을 시켜보기로 했다. 어떤 프로그래밍을 해볼까 하다가, 모스 부호를 이용해서 SOS 신호를 만들어 보기로 했다. "따따따 따-따-따- 따따따" 지금 파이브북스에서 찰스 펫졸드의 를 읽고 있는데, 거기 모스부호에 대한 이야기가 나온다. 모스부호야 말로 1과 0 그 자체, 컴퓨터의 근본이 아니던가? 원래는 아두이노 주문할때 패키지로 딸려온 푸시버튼, 브래드보드, 와이어 등을 사용해서 버튼을 누르면 SOS 신호를 점멸하도록 만들려고 했는데, 무슨 이유에서인지 한 시간을 씨름을 했는데 스위치가 인식이 안 되었다. 방법은 나중에 차차 생각해 보기로 하고, 오늘은 ..