본문 바로가기
Computer Science/Embedded System Design

[임베디드] 1장 아두이노보드 실습 (1)

by na1-4an 2023. 10. 20.

실습1. Bread Board 사용

  • LED의 다리가 긴 쪽이 (+), 짧은 쪽이 (-)

 

실습2. LED 깜빡이기

  - 함수

  • 함수 pinMode(pin, Input or Output): 해당핀을 input으로 사용할 건지, ouput으로 사용할 건지.
  • 함수 digitalRead(pin): 입력 핀의 현재 상태를 읽음.(High or Low)
  • 함수 digitalWrite(pin, High or Low): 출력 핀의 상태를 설정함.
  • 함수 delay(ms): 행동을 멈춤.
  • 함수 analogWrite(pin, val): PWM기법 사용. val은 0~255사이. 출력 전압 = 5V * (val/255)
  • (PWM: Pulse Width Modulation으로 밝기 변경 기법. 9번 핀에서 사용 가능.)

  - 전자 회로 지식

  • 전압: 전위차, 기본 단위 V(볼트)
  • 전류: 전위차에 의해 발생한 전자의 흐름, 기본 단위 A(암페어)
  • 저항: 전류 제어. 기본 단위 옴.
  • I = V/R: 전류 = 전압/저항  ( ex. 5V, 500옴 → 0.01 암페어(10m암페어) )
  • VCC: 전원을 공급하는 핀.
  • GND: 전원을 반환하는 핀

  - 코드

int led1 = 8;
int led2 = 9;
void setup()
{
	pinMode(led1, OUTPUT);
	pinMode(led2, OUTPUT);
}

void loop()
{
	digitalWrite(led1, HIGH);
	digitalWrite(led2, HIGH);
	delay(500);
	digitalWrite(led1, LOW);
	digitalWrite(led2, LOW);
	delay(500);
}

 

# 밝기 변경
int led = 9;
void setup()
{
	pinMode(led, OUTPUT);
}
void loop()
{
	for (int i=10;i<=255;i+=10) {
		analogWrite (led, i);
	delay(200);
	}
}

 

실습3. Button Switch

  - 사용할 스위치: 푸시 버튼 스위치.

  - Button Debounce

    : 버튼을 누르거나 뗄 때 일시적으로 입력값이 불안정

  • Button Debounce H/W 해결책: capacitor 사용(전기가 차단되면 자신이 흡수한 전기를 풀어줌)
  • Button Debounce S/W 해결책: 버튼 입력시 약간 시간 간격을 가지고 측정

  - 코드

int led = 9;
int key = 12;
int led_status = LOW;

void setup() {
	pinMode(led, OUTPUT);
	pinMode(key, INPUT);
	digitalWrite(led, LOW);
}
void loop() {
	if (digitalRead(key) == HIGH) {
		if (led_status == LOW) {
			digitalWrite(led, HIGH);
			led_status = HIGH;
		}
		else {
			digitalWrite(led, LOW);
			led_status = LOW;
		}
	}
	delay(100);
}

 

실습4. 7-Segment

  - 7-Segment

  • FND라고 불림.(Flexible Numeric Display)
  • 1, 2, 3은 세그먼트의 자릿수를 의미.
  • 알파벳과 dot(.)은 불이 들어오는 세그먼트를 의미.

  - 코드

int fndStartPin= 2;
int fndEndPin= 9;

void fndWrite(int num) {
	static unsigned char fnd_segcode[] = {
		0x7E, 0x06, 0xBC, 0x9E, 0xC6, 0xDA,
		0xFA, 0x4E, 0xFE, 0xDE, 0xEE, 0xF2,
		0x78, 0xB6, 0xF8, 0xE8 };
	unsigned char outcode;
	int value;
	if (num < 0) num = 0;
	else if (num >= 16) num = 15;
	outcode= fnd_segcode[num];		
	for (int i=fndStartPin; i<=fndEndPin; i++) {
		value = (outcode& 0x80) ? LOW : HIGH;    # outcode를 검사함!!
		digitalWrite(i, value);		# a 검사, b 검사 ...
		outcode<<= 1;
	}
}

void setup() {
	pinMode(10, OUTPUT); pinMode(11, OUTPUT);
	pinMode(12, OUTPUT);
	for (int i=fndStartPin; i<=fndEndPin; i++)
		pinMode(i, OUTPUT);
	}
    
void loop() {
	for (int num=0; num<16; num++) {
		// digitalWrite(10, HIGH);
		// digitalWrite(11, LOW);
		// digitalWrite(12, LOW);
	fndWrite(num);		# 출력할 숫자. 0~f까지
	delay(500);
	}
}