LEDs Control

hyeony·2025년 8월 26일

임베디드

목록 보기
7/10

1. Understaing GPIOs: Digital I/O, LEDs, and Buttons

가. What is GPIO?

GPIO(General Purpose Input/Output)는 마이크로컨트롤러가 외부 세계와 소통하기 위한 기본 통로이다. 설정에 따라 출력(OUTPUT)을 통해 외부 장치에 신호를 보내거나, 입력(INPUT)을 통해 외부 장치의 신호를 읽을 수 있다.

보드에는 여러 개의 핀이 있으며, 각 핀마다 번호가 붙어 있다. 모든 핀이 GPIO는 아니며, 일부는 GND(접지), 전원 입력(VCC) 등 다른 기능을 가진다. 어떤 핀이 어떤 기능을 하는지는 반드시 핀아웃(pinout) 문서를 참고해야 한다.

나. 디지털 신호와 GPIO 동작

GPIO는 디지털 신호(이진 값)를 주고받는다.

  • High (1) : 전압이 공급됨
  • Low (0) : 접지(0 V) 상태

예시:

  • LED를 GPIO 출력에 연결 → High → LED 켜짐 / Low → LED 꺼짐
  • 버튼을 GPIO 입력에 연결 → 버튼이 눌렸는지 여부를 High/Low로 판별

다. Button 관련 유의 사항

1) Floating

버튼을 제대로 연결하지 않으면 입력 핀이 Floating이 되어 눌리지 않았는데 무작위로 High/Low 값을 읽을 수 있다.

이를 해결하기 위해 풀업(Pull-up) 또는 풀다운(Pull-down) 저항을 사용한다.

  • 풀업 저항: 버튼이 눌리지 않았을 때 기본값을 High로 유지
  • 풀다운 저항: 버튼이 눌리지 않았을 때 기본값을 Low로 유지

대다수의 마이크로컨트롤러는 내부 풀업/풀다운 저항을 지원하며, SW로 설정할 수 있다. 그러나 경우에 따라 안정성을 위해 외부 저항이 필요할 수도 있다.

2) Bouncing

버튼은 기계적 장치라 눌리는 순간 접점이 튀면서 여러 번 빠르게 on/off 신호가 발생할 수 있다. 이 때문에 한 번 눌렀는데 여러 번 눌린 것처럼 인식되는 문제가 생긴다. 이를 해결하는 방법은 Debouncing이다.

  • 하드웨어 디바운싱: 콘덴서를 사용해 신호를 안정화
  • 소프트웨어 디바운싱: 버튼 입력을 감지한 후 짧은 시간 동안 추가 입력을 무시

※ LED 제어 시 주의사항: 저항 필수
LED는 전류가 한 방향으로 흐르면서 빛을 내는 소자이다. 하지만 전류가 과도하게 흐르면 LED와 마이크로컨트롤러가 손상될 수 있다.

따라서 저항(일반적으로 220 Ω~1 kΩ)을 직렬로 연결해 전류를 제한해야 한다. 만약 저항이 작다면 LED는 더 밝아지고, 반대로 저항이 크다면 LED가 어둡게 켜진다.

2. Nucleo-WB55RG Board


본 블로그에서 다룰 보드는 Nucleo WB55LG이다. 이 보드는 IoT 목적에 맞게 설계되었으며 다양한 기능을 제공한다. 주요 특징은 다음과 같다.

가. 주요 특징

① STM32WB 마이크로컨트롤러 탑재

  • 플래시 메모리와 RAM 용량은 크지 않지만, IoT 응용에는 충분

② GPIO 핀 다수 제공

  • 출력(OUTPUT) 또는 입력(INPUT)으로 설정 가능
  • 일부 핀은 GND나 VCC 같은 전원 연결용으로 사용

③ 내부 타이머 지원

  • 일정 시간 지연이나 정밀한 시간 제어가 가능

④ 보드 내장 기능

  • 보드 자체에 LED 3 개가 탑재되어 있다.
  • ADC 기능을 제공하여 아날로그 신호를 디지털로 변환할 수 있음
  • PWM 출력과 통신 프로토콜(SPI, I2C) 지원으로 다양한 센서 제어가 가능
  • Bluetooth 4.0을 지원하여 저전력 무선 통신에 적합

나. 커넥터

① Arduino 호환 커넥터

  • 아두이노 쉴드(HAT)를 그대로 연결할 수 있음

② Morpho 커넥터

  • ST 社 전용 확장 커넥터
  • 핀 개수가 많으며, 다양한 기능 확장이 가능

주의할 점은 Arduino 커넥터와 Morpho 커넥터가 같은 MCU pin을 공유할 수 있다는 것이다. 예를 들어, Arduino D10 핀이 Morpho의 15번 핀과 동일할 수 있다. 따라서 핀 충돌에 유의해야 한다.

다. Pinout

pinout diagram은 각 핀이 어떤 기능을 가지는지 나타낸다.

  • 어떤 핀은 GND에 연결되어 있어 사용 불가
  • 어떤 핀은 단순 GPIO로만 사용 가능
  • 일부 핀은 SPI, PWM, ADC 같은 고급 기능을 지원

따라서 단순히 LED를 연결할 때는 특별한 기능이 없는 GPIO 핀을 사용하는 것이 바람직하다.

라. 실습 환경과 Fritzing Diagram

필자가 참고한 강의에서는 원격 실습 환경을 사용하며, 여기에 이미 여러 외부 주변 장치가 연결되어 있다. 이를 나타낸 것이 Fritzing 다이어그램이다.

3. Practice

가. Explanation for Code

본 실습에서는 첫 번째 버튼(Button 1)만 사용할 것이다. 참고로, 이 버튼은 마이크로컨트롤러의 5번 핀(PC_5)에 연결되어 있다.

입력을 읽기 위해 사용하는 것이 DigitalIn이다. DigitalOut과 비슷하지만 약간 다르다.
예를 들어 DigitalIn button1(BUTTON1); 형태로 선언할 수 있다.

이 객체는 해당 GPIO를 입력 모드로 초기화하기 때문에 따로 핀 모드를 직접 지정할 필요는 없다. 하지만 버튼에는 풀업(pull-up) 또는 풀다운(pull-down) 저항을 설정하는 것이 매우 중요하다. 그렇지 않으면 버튼이 눌리지 않았을 때 핀이 floating 상태가 된다. 따라서 두 번째 인자로 핀 모드를 지정할 수 있는데, 여기서는 기본값을 풀업 모드로 설정하겠다.

그리고나서 LED 깜빡임을 버튼으로 제어해보겠다. 코드에서는 단순히 버튼 상태를 읽어서 조건문으로 확인하면 된다. 그런데 여기서는 풀업을 썼으니, 버튼을 누르면 LOW(0)가 입력된다. 따라서 조건문에서는 if(!button1)과 같은 방식으로 반전시켜야 한다.

/* mbed Microcontroller Library
 * Copyright (c) 2019 ARM Limited
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"

// Blinking rate in milliseconds
#define BLINKING_RATE     500ms

#define EXTERNAL_LED1 PB_13
#define EXTERNAL_LED2 PB_14

#define BUTTON_1 PC_5


int main()
{
    // Initialise the digital pin LED1 as an output
    DigitalOut led1(EXTERNAL_LED1);
    DigitalOut led2(EXTERNAL_LED2);

    DigitalIn button1(BUTTON_1, PinMode::PullUp);

    while (true) {
        if (!button1) {
            led1 = !led2;
            led2 = !led2;

            ThisThread::sleep_for(BLINKING_RATE);
        }
    }
}

나. Result

<참고 자료>
https://learn.sparkfun.com/tutorials/pull-up-resistors/all
https://os.mbed.com/platforms/ST-Nucleo-WB55RG/
https://www.udemy.com/course/microcontrollers-iot-learn-with-real-online-hardware/?kw=Microcontrollers+%26+Embedded+Systems%3A+Use+Real+STM32+Online&src=sac

profile
Chung-Ang Univ. EEE.

0개의 댓글