라즈베리파이의 GPIO를 이용해 실습을 진행하겠습니다.
라즈베리파이 GPIO가 무엇인지 알아보고, 실습에 필요한 Library와 장비를 소개하겠습니다.
I/O
- 임베디드 시스템은 일반적으로 물리 세계와 상호작용함
- 시스템은 다양한 형태의 입력 (Input) 및 출력 (Output) 장치들로 구성됨
- Input device: 키보드, 마우스, 온습도 센서, 가속도 센서, …
- Output device: 모니터, 프린터, 스피커, 모터, LED matrix, …
GPIO
- General Purpose Input/Output의 약어로 범용 입출력을 위한 포트를 뜻함.
- Arduino, Raspberry PI 와 같은 임베디드 보드에서 외부 하드웨어와의 연결을 위하여 활용.
- 입력 또는 출력 모드를 지정하여 활용 가능.
GPIO on Raspberry PI
- Rpi4 40개의 단자 (pin) 중, 26 개의 GPIO 단자가 존재함.
- 일부 GPIO 단자는 다른 인터페이스로 활용 가능.
- UART, I2C, SPI, PWM - Rpi GPIO는 3.3v 전원 사용함.
- 소프트웨어를 통해 3.3v 신호의 High/Low를 제어할 수 있음.
- High/Low 신호를 다양하게 조합하여 복잡한 제어 논리 구성
실습을 진행할때 WiringPi Library를 사용하였습니다. WiringPi Library에 대해 설명을 진행하도록 하겠습니다.
WiringPi Library
- GPIO interface library입니다.
- Braodcom 계열 CPU 에서 GPIO 활용을 도와주는 C library
- 아두이노와 유사한 문법을 사용하여 손쉽게 GPIO 사용 가능
- WiringPi 핀번호와 GPIO 핀번호가 다르기에 주의해서 사용해야합니다.
WiringPi Library 설치
WiringPi Library를 사용하기 위해 라즈베리파이에 설치하는 방법을 알아보겠습니다.
pi@raspberrypi:~ $ git clone https://github.com/wiringpi/wiringpi.git
Cloning into 'wiringpi'...
…..
Receiving objects: 100% (1733/1733), 803.21 KiB | 10.30 MiB/s, done.
Resolving deltas: 100% (1188/1188), done.
위와 같은 과정을 통해 설치가 완료되었다면 정상적으로 설치가 되었는지 확인해야합니다.
이제 실습에 필요한 부품을 소개하고 진행과정에 대해 소개하는 순서로 설명드리겠습니다.
Breadboard
- 제품의 프로토타입 / 간이 회로 등을 만들 때, 쉽게 회로를 구성할 수 있는 기능을 제공하는 회로 제작 기판
- 그림과 같이, 내부가 연결되어 전류가 흐름 (초록색 선).
- 일반적으로 A 영역 (bus strip)에 전원, B/C 영역 (terminal strip)에 소자를 연결하여 제어하는 데에 사용됨.
- 특히, bus strip은 전원선 (+, 빨간색)과 접지선 (-, 파란색)으로 구성되어 있음
LED
- Light Emitting Diode의 약어로 빛을 발산하는 전기소자이다.
- 빨강/파랑/초록 빛의 삼원색을 이용하여 자연색을 구현
- LED 소자는 발광부, 양극 (Anode), 음극 (Cathode) 로 구성됨.
- 다리가 긴 쪽이 양극, 짧은 쪽이 음극. - 전류는 VCC (전원) à GND (접지) 로 흐름.
- LED의 양극을 VCC, 음극을 GND와 연결.
저항 (Resistance)
- 전기의 흐름을 방해하는 부품
- 전기회로 안에서 전기의 흐름을 제한하여 회로 안에서의 전류(또는 전압)의 크기를 낮춤
- 각 소자들은 각각의 임계 전압이 있어서 너무 많은 전류가 흐르면 즉시 소손되기 때문에, 저항으로 전압을 낮춰야 함
- 저항을 선택하는 방법
- R_min = (U_a – U_b) / I_max
- R_min : 사용할 최소 저항, 옴 (Ω)으로 표시
- U_a : 전압 (V)으로 표시되는 전원 공급 장치 전압
- U_b : 소자의 임계 전압, 볼트 (V)로 표시
- I_max : 암페어 (A)로 표시되는 소자의 최대 전류 강도
LED 실습
LED를 제어하는 실습을 진행해보겠습니다.
실습에 필요한 회로도 입니다.
wiringled.c라는 프로그램을 만들어 코드를 작성해보겠습니다.
#include <wiringPi.h> /* wiringPi 라이브러리를 위한 헤더 파일 */
#include <stdio.h>
#include <stdlib.h> /* atoi( ) 함수 */
int ledControl(int gpio)
{
int i;
pinMode(gpio, OUTPUT); /* Pin의 출력 설정 */
for (i = 0; i < 5; i++)
{
digitalWrite(gpio, HIGH); /* HIGH(1) 값을 출력: LED 켜기 */
delay(1000); /* 1초(1000밀리초) 동안 대기 */
digitalWrite(gpio, LOW); /* LOW(0) 값을 출력: LED 끄기 */
delay(1000);
}
return 0;
}
int main(int argc, char **argv)
{
int gno;
if(argc < 2)
{
printf("Usage : %s GPIO_NO\n", argv[0]);
return -1;
}
gno = atoi(argv[1]);
wiringPiSetup( ); /* wiringPi 초기화 */
ledControl(gno);
return 0;
}
코드를 작성하였다면, gcc를 이용해 컴파일하고 실행시켜보겠습니다.
pi@raspberrypi:~ $ gcc -o wiringled wiringled.c -lwiringPi
pi@raspberrypi:~ $ sudo ./wiringled 1
위의 명령어를 통해 프로그램을 실행시켜 LED를 5회 깜빡인후 종료시킬 수 있습니다.
Switch
- 회로를 물리적으로 연결 또는 차단하여 전기의 흐름을 제어
- On (1): 전기가 흐름
- Off (0): 전기가 차단
- Tact switch : 버튼을 누르는 동안 On, 누르지 않는 동안 Off
Switch 실습
Switch를 제어하는 실습을 진행해보겠습니다.
실습에 필요한 회로도 입니다.
wiringswitch.c라는 프로그램을 만들어 코드를 작성해보겠습니다.
#include <wiringPi.h>
#include <stdio.h>
#define SW 5 /* GPIO24 */
#define LED 1 /* GPIO18 */
int switchControl( )
{
int i;
pinMode(SW, INPUT); /* Pin 모드를 입력으로 설정 */
pinMode(LED, OUTPUT);
for (;;)
{ /* 스위치의 확인을 위해 무한 루프를 수행한다. */
if(digitalRead(SW) == LOW)
{ /* Push 버튼이 눌러지면(LOW) */
digitalWrite(LED, HIGH); /* LED 켜기(On) */
delay(1000);
digitalWrite(LED, LOW); /* LED 끄기(Off) */
}
delay(10); /* Ctrl+C 등의 이벤트를 감지하기 위해 잠시 쉰다. */
}
return 0;
}
int main(int argc, char **argv)
{
wiringPiSetup( );
switchControl( ); /* 스위치 사용을 위한 함수 */
return 0;
}
코드를 작성하였다면, gcc를 이용해 컴파일하고 실행시켜보겠습니다.
pi@raspberrypi:~ $ gcc -o wiringswitch wiringswitch.c -lwiringPi
pi@raspberrypi:~ $ sudo ./wiringswitch
위의 명령어를 통해 프로그램을 실행시켜 스위치를 누르면 LED가 켜지고, 떼면 꺼지도록 제어 할 수 있습니다.
'Embedded > Raspberry PI' 카테고리의 다른 글
Raspberry PI GPIO 실습(3) (2) | 2023.12.27 |
---|---|
Raspberry PI GPIO 실습(2) (0) | 2023.12.22 |
Raspberry PI 실습에 사용한 Tool (0) | 2023.12.21 |
Raspberry PI Setup (0) | 2023.12.20 |
Raspberry PI 란? (2) | 2023.12.20 |