Hyogi's Notebook

아두이노와 MCU 그리고 LED 저항 읽는법 알아보기

by 효기’s

마이크로컨트롤러 MCU : Micro Controller Unit

CPU, 메모리, 입출력 모듈 (센서, 신호를 읽고 계산 제어가능한 소형 컴퓨터)

ex) ATMega328

 

아두이노 보드

MCU 응용 / 구성

온도계, 습도계, 조명 센서, 적외선 센서, 압력 센서, 사운드 센서, 모터를 제어

정전압을 위한 부품, USB를 연결하는 칩과 리셋 스위치

CPU, 메모리, IO 로구성

 

CPU 구조

    제어장치 CU연산장치 ALU

              ↓↑                     ↑↓

레지스터 Register(CPU 내장 메모리)

 

MCU의 활용

시각, 청각 출력

입력 신호 센싱, 출력신호 제어

통신, 계산 처리

 

MCU 프로그래밍

PC → (USB) → ST-LINK 디버거와 프로그래머 → PCB (인쇄 회로기판)

아두이노 IDE를 활용

 

대표적인 MCU

AVR, 8051, PIC, ARM

 

전압, 전류, 저항

전류 + → -

V → I → R

 

옴의 법칙

V = I * R

I = V / R

 

브레드보드

위에서부터 아래로 흐른다.

납땜하지 않고 회로를 구성할 수 있다.

LED, 저항, 브레드보드를 아두이노 5V 전원을 이용하여 LED를 켤 수있다.

 

디지털 신호

자료(data)를 표현하는 최소 단위를 수치화

이산적(셀수있는) 수치를 사용

 

데이터가 특정 값으로 표현

자료 변형 없이 저장, 복제, 삭제, 편집 가능

신호의 크기가 특정한 값을 나타내는 막대그래프 모양으로 표현

 

아날로그 신호

자료를 물리량으로 나타냄

자연에서 나오는 신호

연속적인 형태

 

디지털 샘플링 주기

샘플링 주기가 짧으면 데이터와 비슷해진다. (데이터의 패턴을 잘 볼수 있다)

 

아두이노 보드

디지털 입출력 핀 0 ~ 핀 13

아날로그 입력 핀 A0 ~ A5

아날로그 출력 PWM 방식

 

LED

 

짧은 다리가 -  긴 다리가 +

순 방향으로 전압을 가했을때 빛을 발생

발광다이오드

양극(+) 에서 음극(-) 로 전류가 흐를 때 빛을 나타냄

 

저항 읽기 ★

저항은 전류가 흐를 때 흐름을 방해해서 일정한 양만 흐르도록 해주는 역할

저항이 크면 전류가 적게 흐르고 작으면 전류가 많이흐름 

단위 : 옴(Ohm)

4700옴 → 4.7k 옴

1옴 → 1V 전압으로 1A 전류가 흐를때의 저항

LED 깜빡이는 회로 → 220옴 사용

색상은 숫자인데 읽으면 저항의 용량을 알수 있다.

검정 갈색 빨강 주황 노랑 초록 파랑 보라 회색 흰색
0 1 2 3 4 5 6 7 8 9

저항 색상 오차 값

금 5%

은 10%

없음 20%

 

저항 읽기 (색상 띠 3개) 10 * 10^3
색상 갈색 검정 주황 금색 10K옴
1 0 10^3 5%이내

 

저항 읽기 (색상 띠 4개) 100 * 10^2
색상 갈색 검정 검정 빨강 10K옴
1 0 0 10^2

 

디지털 출력 LED제어

디지털 출력은 마이크로 컨트롤러에서 전류를 외부로 내보내는 것이다.

5V를 내보냄 → HIGH

0V를 내보냄 → LOW

1번부터 13번은 디지털 출력을 담당

 

아두이노 4번 핀과 LED의 +극인 긴 다리가 연결

아두이노 GND와 LED -극인 짧은 다리에 연결

 

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);  // 13번핀에 출력
}

void loop(){
  digitalWrite(LED_BUILTIN, HIGH);
  delay(2000);  // wait
  digitalWrite(LED_BUILTIN, LOW);
  delay(2000);  // wait
}

LED_BUILTIN 대신에 13으로 대체 가능

 

void setup(){
  
  pinMode(2, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(7, OUTPUT);
  
}
void loop(){
  digitalWrite(2, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(7, HIGH);
  delay(2000);
  digitalWrite(2, LOW);
  digitalWrite(4, LOW);
  digitalWrite(7, LOW);
  delay(2000);
  
}

# for문으로 간단하게 변경가능

int LED[] = {2, 4, 7};
int Delay[] = {500, 500};

void setup(){
  for(int i = 0; i < 3; i++) {
    pinMode(LED[i], OUTPUT);
  }
}

void loop(){
  for(int i = 0; i < 3; i++) {
    digitalWrite(LED[i], HIGH);
    delay(Delay[0]);
    digitalWrite(LED[i], LOW);
    delay(Delay[1]);
  }
}

LED를 여러개 깜박일 경우 연결한 PIN번호를 맞게 설정해줘야한다.

 

LED 여러 개 깜박거리기
void setup(){
  Serial.begin(9600);    # 시리얼 통신 선언 및 속도지정
  pinMode(13, OUTPUT);
}

int i;
void loop() {
  if(Serial.available() > 0) {
    i = Serial.read();   # 시리얼 데이터 읽음
    Serial.println(i);   # 시리얼 정보 출력
    if(i === '1') digitalWrite(13, HIGH);   # 1이면 HIGH 출력
    if(i === '0') digitalWrite(13, LOW);    # 0이면 LOW 출력
  }
}

 

디지털 입력

풀업 풀다운 저항

   스위치가 열리면 플로팅 상태

   스위치가 닫히면 전류가 흐름

 

-풀업저항 (5V 연결된 상태)

   스위치가 열리면 전류가 흐름

   스위치가 닫치면 전류가 흐르지 않음

 

-풀다운저항 (저항이 GND쪽에 연결)

   스위치가 열리면 전류가 흐르지않음

   스위치가 닫치면 전류가 흐름

 

# 풀업 스위치 회로 ( 누르지 않을때 1 눌렀을때 0)
int inPin = 2;   # 연결된 디지털 핀번호
int val = 0;  # 읽은값을 저장하는 변수 val

void setup(){
  Serial.begin(9600);
  pinMode(inPin, INPUT);
}

void loop(){
  val=digitalRead(inPin);
  Serial.println(val);
  delay(100);
}

 

디지털 입력

버튼을 이용 led제어

int buttonPin = 2;  // 버튼 연결번호
int ledPin = 13;  // LED 핀번호
int buttonState = 0;  // 입력핀 상태저장

void setup(){
  pinMode(ledPin, OUTPUT);  // LED는 출력
  pinMode(buttonPin, INPUT);  // 버튼은 입력
}

void loop(){
  buttonState = digitalRead(buttonPin);  // 입력 값을 읽고 저장
  
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  }
  else {
  	digitalWrite(ledPin, LOW);
  }
}

 

아날로그 데이터 출력

자연의 소리나 빛처럼 연속적으로 연결되는 신호

PWM(Pulse Width Modulation) 을 이용하여 값 제어 → 펄스의 폭을 변경해 제어해주겠다

0~255 까지 값 출력가능

 

PWM 사용할 수 있는 번호 → ~3, ~5, ~6, ~9, ~10, ~11 ★★

 

int led01 = 3;  // PWM 3번 연결
int led02 = 6;  // PWM 5번 연결

void setup(){
	pinMode(led01, OUTPUT);
    pinMode(led02, OUTPUT);
}
void loop() {
	analogWrite(led01, 10);  // 밝기 낮음
    analogWrite(led02, 255);  //  밝기 높음
}

 

부저로 음악 연주하기

void setup() {
	tone(3, 523, 500);  // 핀번호, 주파수, 지속시간
    delay(500);
}
void loop(){
}

 

가변 저항기(아날로그 데이터)

손잡이 돌리는 위치에 따른 전압의 변화

반시계 → 0V

시계 → 5V

가운데위치 → 2.5V

전압의 크기 10비트, 1~1023의 정수 값으로 대응

 

아날로그 입력 A0~A5

아날로드 값 입력을 위해 ADC기능 사용

ADC기능은 아날로그 신호를 디지털 신호로 변환하여 사용할 수 있게 하는 기능

 

가변저항기 첫번재 다리 5V에 연결

3번째 다리 GND에 연결

가운데 다리 A0의 연결

void setup() {
	Serial.begin(9600);
}
void loop() {
	int a = analogRead(A0);  // 전송속도 지정
    Serial.println(a);  // 모니터에 출력
    delay(100);
}

 

가변저항기 값을 읽고 LED보내기

void loop() {
	val = analogRead(A0); //A0 에서 값을 읽음
    digitalWrite(ledPin, HIGH); 
    delay(val);
    digitalWrite(ledPin, LOW);
    delay(val);
}

 

조도센서(CDS)

빛의 밝기 측정

빛이 많으면 저항이 작아지고 적게들어오면 저항이 커짐

 

빛의 밝기를 읽을때 analogRead() 함수 사용

Serial.println(sensorValue); //시리얼 포트번호 출력

 

아날로그 온도센서(LM 35)

저항없이 바로 브레드보드에 사용가능한 온도센서

-55도에서 150도까지 측정 가능

아날로그 입력핀에 연결하여 온도를 측정

 

왼쪽 5V, 가운데 A0, 오른쪽 GND

 

디지털 온습도 센서(DHT11)

주변 온습도 측정가능

온도 : 0도에서 50도 측정가능

습도 : 20~90% 측정가능

<라이브러리 설치해야함 dht11 설치>

 

아날로그 초음파 (ultrasound)센서

사람이 들을수 있는 주파수 범위 16hz~20khz

 

신호를 보내는 발신부와 물체에 반사되어 돌아오는 수신부가 분리

신호를 보내고 반사되어 돌아오는 시간 계산해서 거리 측정

신호를 보내면 Trig, 받는 부분 Echo

 

동작전압 5V

발생 주파수 : 40kHz

측정거리 : 2~400cm

 

Duration : 에코핀 포트 HIGH 될때까지 시간을 측정한 값

단위 : microseconds

Distance : 초음파 측정 거리 결과

 

적외선 리모컨 송수신

IR 리모컨으로 신호를 보내면 IR 리시버에서 신호를 받아 시리얼 모니터에 표시

IRremote라이브러리 설치

 

아날로그 입력 = analogRead() 함수 사용

 

블로그의 정보

감성 개발자 효기

효기’s

활동하기