[아두이노 기초] 전체 글 목록

2017/07/27 - [분류 전체보기] - [아두이노 기초] 전 과정 목록

이번시간에는 아날로그 입력에 대해서 알아보겠습니다.
아날로그입력은 ADC(Analog Digital Converter)라는 기능으 이용합니다. ADC란 연속적인 신호인 아날로그 신호를 부호화된 디지털신호로 변환하는 장치로 온도,압력,음성,영상신호,전압등을 연속적인 아날로그 신호로 측정하여 그 신호를 컴퓨터로 입력하고 디지털로 변환하는 것입니다.(아날로그->디지털)

아두이노에는 ADC모듈이 자체적으로 달려있으므로 바로 이기능을 사용할수 있습니다. 오늘 배울 것은 ADC를 활용한 함수인 analogRead(pin번호)입니다.


1. 가변저항을 이용하여 LED밝기 조절하기

가변저항은 저항의 값을 임의의 저항값으로변경가능한 저항입니다. 회로구성을 보도록 하죠.

가변저항을 돌리게되면 A0(아날로그 입력핀)에서 저항값을 읽습니다. 그뒤 그저항값에 따라 D9(아날로그 출력)에서 LED로 아날로그 출력을 줘서 LED밝기를 조절하는 구조 입니다.

int sensorPin = A0; // select the input pin for the potentiometer

int led = 9; // the pin that the LED is attached to

 

void setup()

{

pinMode(led, OUTPUT);

Serial.begin(9600);

}

 

void loop()

{

int sensorValue = 0;

 

sensorValue = analogRead(sensorPin);

analogWrite(led, sensorValue);

Serial.println(sensorValue);

 

delay(10);

}

새로운 함수가 나왔습니다. analogRead(pin번호)는 pin번호에 연결된 장치의 값을 읽어 아날로그 값으로 변환후 int값으로 반환해주는 함수입니다. analogRead는 입력된 잔압을(0v~5v) 0~1023까지의 숫자로 변환해 줍니다.

전체 코드의 내용은 analogRead로 받은 가변저항의 값을 전시간에 배웠던 analogWrite함수로 출력한뒤 시리얼로 가변저항의 값을 출력해주는 것입니다. 펌웨어 업로드후 실행하여 보면 가변저항을 돌리는 것에 따라 led의 밝기가 변하는 것을 확인할 수 있습니다.

이것으로 아날로그 읽기, 쓰기에 대해 모두 알아 보았습니다. 다음시간에는 LCD모니터를 활용하는 것에대해 알아 보도록 하겠습니다.

[아두이노 기초] 전체 글 목록

2017/07/27 - [분류 전체보기] - [아두이노 기초] 전 과정 목록

우리는 저번에 디지털입출력을 통해 아두이노가 동작을 할수 있도록 해 보았습니다. 장치를 on 하거나 off 하는일은 세밀한 정보가 필요하지 않았죠. 0이거나 1이거나 둘중하나만 있으면 충분했습니다.

하지만 이런경우는 어떨까요?

단지 led가 켜지고 꺼지는 것이 아니라 led의 밝기를 조절해야 한다면 디지털입출력을 사용해서는 쉽지않을 것입니다.

이럴때 사용해야하는 것이 바로 아날로그 입출력입니다.

그럼 입출력중에서 아날로그 출력에 대해 알아보도록 하겠습니다.

우선 알아야 할것이 아두이노 자체에서 전압을 조절하는 능력은 없습니다. 그렇기 때문에 PWM(Pulse Width Modulation) 펄스폭변조 이란 방법을 사용하는 것이죠.

PWM은 펄스폭을 조절해서 전류를 조정하는 것으로 간단한 무드등을 제어하거나 부저의 음계 제어, 스마트 폰등에서 화면의 밝기를 조정하는 것 등등 많은 곳에서 사용됩니다.


이 그림을 보시면PWM이 어떤 식으로 전류를 조정하는지 알수 있습니다.

5v출력의 on/off반복을 통해서 평균전압을 낮추는 방법입니다. 간단하게 생각해서 100번 동안 5v출력이 100번 = 5v, 100번 동안 5v출력이 50번 = 2.5v가 되는것이죠. 이과정을 빠르게 반복하므로 아날로그 출력이 가능해 지는 것입니다.


아두이노 UNO에서 PWM기능을 가진 핀은 핀번호 앞에 (~)표시가 써져있습니다.  3,5,6,9,10,11번 핀이 PWM핀입니다.

그럼이제 PWM을 이용하여 LED밝기를 조절해보도록 하겠습니다.

1. PWM을 이용한 LED의 밝기 조절

간단한 회로를 구성해 봅시다. 빨간선은 신경쓰지 않으셔도 됩니다.

회로구성후 아래의 코드를 작성하고 실행시켜 보도록 하죠.

int led = 9; // the pin that the LED is attached to

int brightness = 0; // how bright the LED is

int fadeAmount = 5; // how many points to fade the LED by

 

void setup()

{

    pinMode(led, OUTPUT);

}

 

void loop()

{

analogWrite(led, brightness);

brightness = brightness + fadeAmount;

if (brightness == 0 || brightness == 255)

{

    fadeAmount = -fadeAmount ;

}

delay(30);

}

brightness라는 변수를 정해주어 0에서 255가 될때까지는 5씩 brightness값이 증가하고 255가 되면 반대로 5씩 brightness값을 감소시켜 LED가 천천히 켜지고 천천히 꺼지는 동작을 구현 할수 있습니다.

이번에는 펄스(PWM)을 이용하여 부저를 연주해보도록 하겠습니다.

2. 펄스(PWM)으로 부저 연주하기

회로를 보시면 새로운 부품이 보일겁니다. 아날로그회로에서 증폭기 역할을 해주는 npn트랜지스터입니다. 

int speakerPin = 8;

int numTones = 10;

int tones[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};

// mid C C# D D# E F F# G G# A

void setup()

{

}

 

void loop()

{

    for (int i = 0; i < numTones; i++)

{

tone(speakerPin, tones[i]);

delay(500);

}

noTone(speakerPin);

delay(1000);

}

 

새로운 함수가 보입니다. tone(pin,frequency)함수입니다.

tone(pin,frequency)는 pin번호에  frequncey값에 맞는 주파수를 출력하여 소리를 내게해주는 함수입니다. 이때 tone(pin,frequency,duration)으로 시간(ms)까지 설정이 가능 합니다. 또한 tone함수는 아두이노3번핀과 11번핀에서는  사용이 불가능 하며 31~65545의 주파수를 재생 가능합니다.

소리를 끄고 싶을때는 notone()함수를 사용하시면 됩니다.

소스코드 설명 : tones배열의 각각의 음계에 맞는 주파수를 저장한뒤 for문을 통해서 해당음계를 하나씩 소리냄


이것을 응용하면 녹음이 가능한 간단한 연주기계를 만드는 것도 가능합니다.

녹음기능 피아노에 대한 내용한 후에 포스팅 하도록 하겠습니다. 

[아두이노 기초] 전체 글 목록


이번시간에는 시리얼통신을 사용하는 방법과 시리얼통신을 활용해 led등의 장치를 조작해보는 일을 해보도록 하겠습니다.

시리얼(RS232) 통신은 무엇인가?

rs232 통신은 주로 ibm 호환 pc에서 쓰이는 시리얼 통신 방법입니다.

예전에는 모뎀연결에 rs232통신을 많이 사용하였으며 최장 1.5m정도로 다소 짧은 통신 거리를 가지고 있습니다.

최근에 나오는 노트북들은 두께,무게를 줄이기 위해서 UART포트를 없애고 있는 추세입니다.

아두이노에서는 기본으로 제공하고 있는 usb포트를 이용해서 UART통신이 가능합니다.

빨간부분이 시리얼통신을 가능하게 해주는 칩입니다.


시리얼 통신 시작하기

1. 우노보드와 pc를 동봉되어있는 usb케이블로 연결합니다.

2. pc에 연결된 usb의 포트번호를 아두이노 ide에서 설정해 줍니다.

3. 아래의 코드를 작성해 줍니다.

void setup()

{

Serial.begin(9600);//시리얼 통신을 보드레이트 9600으로 시작

// Serial.println(“Hellow Arduino”);

}

 

void loop()

{

char read_data;

 

if (Serial.available())//시리얼통신으로 수신된 데이터가 있을때 true

{

read_data = Serial.read();//read_data에 Serial.read()함수로 한글자 불러와 저장

Serial.print(read_data);//read_data를 시리얼로 출력

}

delay(10);

}

설명 : ide의 시리얼통신 창에서 메세지를 입력하면 그메세지가 그대로 ide의 시리얼통신창에 뜨도록 하는 코드입니다.

10ms마다 반복하며 수신된 데이터가 있을때 다시 그데이터를 송신해주는 방식입니다.

4. ide의 시리얼 모니터 실행후 메세지 입력

시리얼 모니터 - 오른쪽위의 돋보기아이콘

5. 시리얼 모니터에 메세지 출력되는지 확인


시리얼 통신으로 LED제어하기

우리는 위에서 시리얼통신이 이상없이 동작하는 것을 확인하였습니다.

그럼 이번에는 시리얼로 아두이노에 명령을 입력했을때 아두이노에서 그 명령에 맞는 동작을 할수 있도록 만들어 보도록 합시다.


1. 회로구성

기본 LED제어 회로와 다른것이 없습니다.

2. 코드 작성

int led1 = 7;

int led2 = 6;

int led1_status = LOW; // LED1 상태

int led2_status = LOW; // LED2 상태

void setup()

{

pinMode(led1, OUTPUT);//핀모드 설정 출력

pinMode(led2, OUTPUT);

digitalWrite(led1, LOW);//핀의 초기값 LOW = LED OFF

digitalWrite(led2, LOW);

Serial.begin(9600);//시리얼 통신 시작

}

void loop()

{

char read_data;

if (Serial.available())

{

read_data = Serial.read();//시리얼통신으로 수신한데이터 read_data에 저장


if( read_data == '1' && led1_status == LOW)//read_data값이 1이고 led1이 off상태일때

{

digitalWrite(led1, HIGH);//led1 on

led1_status = HIGH;

Serial.println("LED1 ON");

}

else if( read_data == '1' && led1_status == HIGH )//led1이 on상태일때

{

digitalWrite(led1, LOW);//led2 on

led1_status = LOW;

Serial.println("LED1 OFF");

}

if( read_data == '2' && led2_status == LOW)

{

digitalWrite(led2, HIGH);

led2_status = HIGH;

Serial.println("LED2 ON");

}

else if( read_data == '2' && led2_status == HIGH )

{

digitalWrite(led2, LOW);

led2_status = LOW;

Serial.println("LED2 OFF");

}

}

delay(10);

}

 


설명 : 시리얼로 메세지를 받아 1일때는 led1에대한 동작을 하고 2일때는 led2에대한 동작을 하도록 하였고 동작정보를 시리얼로 출력하도록 하였다.

이때 led현재상태를 저장하는 변수(led1_status, led2_status)를 만들어 off상태일때는 on하고 on상태일때는 off하도록 설정 하였다.

코드를 업로드 한뒤 시리얼모니터에 1 또는 2를 입력하면 아두이노에 연결된 led가 동작할 것이다.

또한 위와 같이 시리얼로 아두이노가 어떤 동작을 하였는지 출력되는 것을 볼수 있다.


시리얼 통신 복습하기

1. LED를 전 후 좌 우 4방향에 배치 한뒤 숫자키패드의 화살표 키를 이용하여 4개의 LED를 제어하기

위의 코드의 if문만 조금 수정하면 쉽게 성공하실수 있을 것입니다.


오늘은 시리얼 통신에 대해 알아보았습니다. pc와 아두이노 간의 통신이 생각보다 정말 간단하죠.

다음시간에는 아날로그 입출력에 대해 공부해보도록 하겠습니다.


[아두이노 기초] 전체 글 목록

우리는 디지털 입출력방법에 대해 배웠으므로 이번시간에는 부저를 사용하여 소리를 내어보도록 하겠습니다.

그렇다면 부저는 무엇일까요?

부저는 TV, 세탁기, 에어컨 등에서 Alarm음으로 사용되기도 하고 도난 경보기, 디지털 도어 록등에서 사용되는 작은 스피커라고 생각하면 됩니다.


디지털 출력으로 부저 울리기

1초에 한번씩 부저를 켰다 껐다 반복하도록 제작

디지털핀 8번으로 출력을 주어 부저를 동작하게하는 구조입니다.

int buzzer = 8;

void setup()

{

pinMode(buzzer, OUTPUT);

}

 

void loop()

{

digitalWrite(buzzer, HIGH); // Buzzer on

delay(1000);

digitalWrite(buzzer, LOW); // Buzzer off

delay(1000);

}

pinMode로 8번핀을 출력으로 설정하였습니다.

digitalWrite를 사용하여 부저를 on한뒤 1초뒤에 off하는것을 반복합니다.


코드를 업로드한뒤 동작을 확인하여보면 1초에 한번씩 부저가 켜졌다 꺼졌다 하는것을 볼수 있습니다.


실습예제

1. 버튼으로 디지털입력을 받아서 부저를 울리도록 구현

회로구성 - 버튼에 5v연결후 반대쪽을 입력핀으로 연결, 부저는 출력핀에 연결

int buzzer = 8;

int button =9;

void setup()

{

pinMode(buzzer, OUTPUT);

pinMode(button, INPUT);

}

 

void loop()

{

if(digitalRead(button)==HIGH)

digitalWrite(buzzer,HIGH);

else

digitalWrite(buzzer,LOW);

}

2. 버튼으로 디지털입력을 받으면 LED는 켜져있고 부저는 ON/OFF반복 구현 

회로구성 - 버튼에 5v연결후 반대쪽을 입력핀으로 연결, 부저, led는 출력핀에 연결

int led=7;

int buzzer = 8;

int button =9;

int buzzer_count=0;

int buzzer_flag=0;

void setup()

{

pinMode(led, OUTPUT);

pinMode(buzzer, OUTPUT);

pinMode(button, INPUT);

}

 

void loop()

{

if(digitalRead(button)==HIGH)

digitalWrite(led,HIGH);

else

digitalWrite(led,LOW);


if(buzzer_count<200)

{

buzzer_count++;

}

else

{

buzzer_count=0;

if(buzzer_flag==0)

buzzer_flag=1;

else

buzzer_flag=0;

}

if(buzzer_flag)

digitalWrite(buzzer.HIGH);

else

digitalWrite(buzzer,LOW);

}

코드를 꼭 이해하시고 더좋은 방향을 바꾸어 보시길 바랍니다.

다음시간에는 시리얼 통신에 대해 알아보도록 하겠습니다.

[아두이노 기초] 전체 글 목록

1. 디지털 출력이란?

아두이노에서 출력은 크게 디지털 방식과 아날로그 방식으로 나눌 수 있다.그중 디지털 출력은 마이크로 컨트롤러의 특정 핀의 전압을 HIGH 또는 LOW로 설정하는 것입니다. 


위에 보이는 부분이 디지털 입출력핀 입니다. 총 13개를 사용할수 있습니다.


2. LED 제어하기

아두이노 하드웨어 외부에 브레드보드를 이용해서 LED를 깜박이도록 해보겠습니다.

500msec(0.5) 간격으로 LED 2개가 동시에 켜졌다가 꺼졌다가를 반복하도록 설정해 봅시다.

필요한 부품은 브래드보드 1개, 아두이노 uno, led와 1k옴 저항 2개 입니다.


A. 회로구성하기

회로구성을 아래 그림과 같이 합니다.

회로를 간단히 설명하자면 디지털출력 핀 8, 9번에서 5v출력을 내어주면 저항을 거쳐 led로 들어가 불이켜지게 된후 gnd그라운드로 빠져나가게 되는것입니다. (여기서 적색 5v선은 사용하지 않습니다.)


B. 소스코드 작성하기

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 led1 =8 int led2 = 9 : led가 연결된 디지털 핀의 번호를 설정

void setup() : 반복문에 들어가기전 설정하는 부분

pinMode(led1,OUTPUT) : 해당핀의 모드를 설정합니다. (대문자 주의)

OUTPUT=출력  INPUT=입력

void loop() : 코드가 시작되고 계속해서 반복되는 부분 ex)while(1)

digitalWrite(led1,HIGH) : led1번핀에 HIGH신호를 준다. 5v출력->LED ON

delay(500) : 500ms(0.5초)동안 딜레이를 준다.

digitalWrite(led1,LOW) : led1번핀에 LOW신호를 준다 5v출력 x->LED OFF


코드를 보드에 업로드 하고 동작을 확인해 보면 2개의 LED가 0.5초 간격으로 동시에 켜지고 동시에 꺼지는 것을 확인할 수 있습니다.


C. 여러 예제 직접 시도해보기

이부분이 가장 중요한 부분입니다. 항상 자신이 직접 생각해보는 것이 중요하기 때문에 간단한 소스코드지만 이것을 조금씩 수정해보며 해결해 보시길 바랍니다.

1. 2개의 LED를 서로 번갈아가며 깜빡이게 만들기.

2. LED1은 0.5초 간격 LED2는 0.25초 간격으로 깜빡이게 만들기.

꼭 해보시길 바랍니다! 궁금한 사항이 있으면 댓글로 질문해주세요. 빠른시간안에 답변해드리겠습니다.




[아두이노 기초] 전체 글 목록

통합개발환경(IDE)란?

아두이노 개발을 쉽게 할수 있도록 도와주는 도구로써 관련 라이브러리와 컴파일과 관련된 기계어를 아두이노에 업로드 해주는 스케치 프로그램이다.


다운로드 및 설치방법

통합개발환경(IDE) 다운로드

다운로드를 눌러 사이트로 접속하면 위의 사진과 같이 보일것이다. 그럼 오른쪽에 자신의 컴퓨터에 맞는 버전을 골라 다운로드후 설치하면 된다.

윈도우10를 쓰는 경우는 윈도우 앱스토어에서 아두이노 IDE를 검색하여 설치하여도 간단히 설치할 수 있다.


IDE사용 방법

IDE를 처음 실행시키면 위의 화면이 보입니다.

그럼 차례대로 기능을 알아보도록 합시다.

 컴파일 버튼 : 작성한 코드를 컴퓨터 언어로 컴파일

 업로드 버튼 : 컴파일 후 아두이노로 코드 업로드

시리얼 모니터 : 아두이노와 시리얼 통신을 하여 상태를 읽고 씀

텍스트에디터 : 스케치를 작성하는 부분

콘솔 :  프로그램의 에러나 컴파일 상태를 나타내는 부분


IDE기본 세팅 방법

IDE를 설치 하였으니 처음 아두이노를 연결하는 방법을 알아보도록 하자.

우리는 아두이노 UNO보드를 사용할 것이므로 

툴-보드매니저-Arduino/Genuino UNO를 선택해준다.


선택을 완료했으면 아두이노와 IDE를 연결할 포트를 설정해 주자.

툴-포트-COM번호(Arduino/Genuino Uno) 


이렇게 해주면 기본 세팅이 완료된다.

다음시간에는 간단한 LED를 키고 끌수 있는 것을 직접 코딩해보도록 하자.


+ Recent posts