아두이노용 효율적인 8비트 IO 포트 라이브러리 – 디지털 제어 확장
부품 및 소모품
| 아두이노 우노 (Arduino UNO) |
× |
1 |
| 5mm 적색 LED |
× |
1 |
| 10kΩ 단회전 포텐셔미터 |
× |
1 |
앱 및 온라인 서비스
프로젝트 소개
아두이노는 digitalWrite()로 디지털 출력을, digitalRead()로 디지털 입력을 처리합니다. 하지만 이 함수들은 한 번에 한 핀만 제어할 수 있습니다. 7세그먼트 디스플레이, DIP 스위치, DAC 같은 8비트 장치를 연결하려면 8개 핀에 각각 0/1 패턴을 보내야 합니다. 예: 데이터 0x37(0011 0111)이면 8개 핀에 비트별로 써야 합니다.
이 문제를 해결하고자 8비트 IO 포트 라이브러리를 만들었습니다. 아두이노의 임의 8개 핀을 묶어 하나의 8비트 입출력 포트처럼 사용할 수 있습니다. 데이터 방향은 'O'(출력) 또는 'I'(입력) 문자로 설정합니다.
라이브러리는 단 5개 함수로 구성됩니다:
IO_Port_8bit(pin1..pin8, dir) – 포트 객체 생성, 방향 고정
IO_Port_8bit(pin1..pin8) – 방향 미지정, 런타임에 변경 가능
set_IO_direction(dir) – 방향 설정 ('I' 또는 'O')
send_8bit_data(byte) – 8비트 데이터 출력 (0~255)
get_8bit_data() – 8비트 데이터 입력 읽기
예제 1: 8개 LED를 1Hz로 번갈아 점멸
#include <IO_Port_8bit.h>
IO_Port_8bit myport(2,3,4,5,6,7,8,9, 'O'); // 출력 포트 생성
void setup() {}
void loop() {
myport.send_8bit_data(85); // 홀수 LED 켜기 (01010101)
delay(500);
myport.send_8bit_data(170); // 짝수 LED 켜기 (10101010)
delay(500);
}
예제 2: LED에 0~F 이진 카운트 표시
#include <IO_Port_8bit.h>
IO_Port_8bit my8bitport(2,3,4,5,6,7,8,9);
void setup() {
my8bitport.set_IO_direction('O');
}
void loop() {
for (int i=0; i<16; i++) {
my8bitport.send_8bit_data(i);
delay(200);
}
}
예제 3: 아날로그 입력 전압을 8비트 LED 바그래프로 표시
#include <IO_Port_8bit.h>
IO_Port_8bit myport(2,3,4,5,6,7,8,9, 'O');
void setup() {
myport.send_8bit_data(255); delay(500);
myport.send_8bit_data(0);
}
void loop() {
int level = analogRead(A0);
level = map(level, 0, 1023, 0, 80);
if (level < 80 && level > 70) myport.send_8bit_data(255);
else if (level <= 70 && level > 60) myport.send_8bit_data(127);
else if (level <= 60 && level > 50) myport.send_8bit_data(63);
else if (level <= 50 && level > 40) myport.send_8bit_data(31);
else if (level <= 40 && level > 30) myport.send_8bit_data(15);
else if (level <= 30 && level > 20) myport.send_8bit_data(7);
else if (level <= 20 && level > 10) myport.send_8bit_data(3);
else if (level <= 10 && level > 0) myport.send_8bit_data(1);
else if (level == 0) myport.send_8bit_data(0);
}
예제 4: DIP 스위치 8비트 입력 읽어 시리얼 모니터에 표시
#include <IO_Port_8bit.h>
IO_Port_8bit myport(2,3,4,5,6,7,8,9);
void setup() {
Serial.begin(9600);
myport.set_IO_direction('I');
Serial.println("8-bit input port test");
}
void loop() {
int input_byt = myport.get_8bit_data();
Serial.print("received input = ");
Serial.println(input_byt);
delay(1000);
}
코드
라이브러리 파일은 다운로드만 가능합니다. (미리보기 없음)
회로도
IO 포트가 서로 다른 핀들로부터 직접 8비트 데이터를 입출력하는 구조입니다.